Android 如何存储一个;“不可信/自签名”;未来连接的证书

Android 如何存储一个;“不可信/自签名”;未来连接的证书,android,ssl,httpsurlconnection,Android,Ssl,Httpsurlconnection,在Android上使用HttpsUrlConnection,如果我使用不受信任的证书(很可能是自签名证书)连接到服务器,我将得到一个错误。 例如,当浏览器中发生类似情况时,我可以选择接受该证书 计划是正常运行URL连接 如果发生证书错误,请使用伪“trust all”重新运行它 设置,当然仍然会立即断开连接 已收到证书(在X509TrustManager和 然后是主机名验证程序)。在HostNameVerifier中返回false 这个把戏做得很好 询问用户是否确实要使用此证书 现在,如何将此证

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

  • 计划是正常运行URL连接
  • 如果发生证书错误,请使用伪“trust all”重新运行它 设置,当然仍然会立即断开连接 已收到证书(在X509TrustManager和 然后是主机名验证程序)。在HostNameVerifier中返回false 这个把戏做得很好
  • 询问用户是否确实要使用此证书
  • 现在,如何将此证书添加到应用程序的存储中,以便下次连接到该服务器时使用

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

    换句话说

  • 从服务器检索公共证书(完成)
  • 询问用户是否仍要使用它
  • 将该公共证书导入应用程序自己的存储中的某个位置,以便在将来的连接中使用
  • 所有CA受信任证书的回退到常规信任链

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

    如果我正确理解了您的问题,那么您就不必像您的问题那样接受验证器

    以下代码是我认为您可以参考的示例:

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

    有关证书文件的更多信息,
    getSSLSocketFactory
    。。。您可以参考以下问题(当然它们可以应用于
    HttpsUrlConnection
    ):


    希望这有帮助

    您还需要TrustManager。目前,我正在使用一个使用系统密钥库的自定义X509TrustManager,以及另一个使用我自己的密钥库的自定义X509TrustManager,在验证方法中,如果“全局”密钥库无法验证,我会捕获错误,然后调用内部TrustManager对我自己的密钥库进行测试。如果失败,则连接不可信,我可以让他们从custom TrustManager中提取收到的证书链,并询问用户,将证书添加到我自己的KeyResorry中。我不太了解您的评论。看起来你已经有了自己的解决方案,你的问题在寻找什么?
         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);
                        }
                    });