android - 如何为将来的连接存储 "untrusted/selfsigned"证书

标签 android ssl httpsurlconnection

在 Android 上使用 HttpsUrlConnection 时,如果我使用不受信任的证书(很可能是自签名证书)连接到服务器,我将收到错误消息。 例如,当浏览器中发生类似情况时,我仍然可以选择接受该证书。

  1. 计划是正常运行 URL 连接。
  2. 如果发生证书错误,请使用 Dummy“trust all”重新运行 设置,当然仍然会尽快断开连接 已收到证书(在 X509TrustManager 和 然后是 HostNameVerifier)。在 HostNameVerifier 中返回 false 做得很好。
  3. 询问用户是否真的想使用这个证书。

现在,我如何将此证书添加到应用程序的存储区,以便下次连接到该服务器时使用它?

或者我是否需要自己制作 X509TrustManager/HostNameVerifier,并将传入的证书数据与存储的证书数据进行比较,同时保持所有 CA 签名证书的正常功能。

换句话说。

  1. 从服务器检索公共(public)证书(完成)
  2. 询问用户是否仍要使用它。
  3. 将该公共(public)证书导入应用自己的商店中的某处,以供将来连接使用。
  4. 回退到所有 CA 信任证书的常规信任链。

因为我在所有其他问题中都看到过类似的问题,人们开始提供所有错误的解决方案。我想要一个 AcceptAllVerifier。我可以使用任何需要我手动导入证书的东西。

最佳答案

如果我正确理解您的问题,那么您不必像您的问题中那样AcceptAllVerifier

下面的代码是一个例子,我想你可以引用一下:

假设您的服务器应用程序托管在一台服务器机器内,该机器具有服务器证书,例如,“颁发给”“localhost”。然后,在 verify 方法中,您可以验证“localhost”。

     HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
     urlConnection.setSSLSocketFactory(getSSLSocketFactory());
     urlConnection.setHostnameVerifier(new HostnameVerifier() {
               @Override
                    public boolean verify(String hostname, SSLSession session) {
                        HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
                        return hv.verify("localhost", session);
                    }
                });

更多关于cert文件,getSSLSocketFactory...可以引用以下问题(当然HttpsUrlConnection也可以申请):

Does Android Volley support SSL?

Volley SSL - Hostname was not verified

希望这对您有所帮助!

关于android - 如何为将来的连接存储 "untrusted/selfsigned"证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32935094/

相关文章:

android - Android 媒体播放器上的错误

java - Android AudioRecord - 如何获得一分钟的平均音量

html - Confluence html宏ssl异常

java - 向 LINE Notify 发送消息失败(使用 HttpsURLConnection POST)

java - 服务器不支持 Android 5.0 的默认密码套件

Android Activity - 在一个 Activity 类中包含大量代码是否很常见?

android - 在市场上发布您的应用程序之前,是否有一种简单的方法来获取 "deactivate logging"?

javascript - Phantomjs加载地址失败

php - 在 PHP 中签署公共(public) x509 证书

java - 如何从 Android 执行 HTTPS POST?