【问题标题】:How to store an "untrusted/selfsigned" certificate for future connections如何为将来的连接存储“不受信任/自签名”证书
【发布时间】:2016-01-01 07:29:47
【问题描述】:

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

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

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

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

换句话说。

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

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

【问题讨论】:

    标签: android ssl httpsurlconnection


    【解决方案1】:

    如果我正确理解您的问题,那么您不必像您的问题那样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

    希望这会有所帮助!

    【讨论】:

    • 您还需要 TrustManager。目前,我正在使用系统密钥库使用自定义 X509TrustManager,并使用我自己的密钥库在其中使用另一个自定义 X509TrustManager,然后在验证方法中,如果“全局”密钥库无法验证,我会捕获错误,并且然后针对我自己的 KeyStore 调用内部 TrustManager 测试。如果失败,则连接不受信任,我可以让他们从自定义 TrustManager 中提取收到的证书链并询问用户,将证书添加到我自己的密钥库中
    • 对不起,我不太了解您的评论。看起来您已经有了自己的解决方案,您在寻找什么问题?
    猜你喜欢
    • 1970-01-01
    • 2013-02-08
    • 2018-04-16
    • 2012-04-23
    • 2020-11-24
    • 2017-04-21
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    相关资源
    最近更新 更多