如何存储"不受信任/自我签名"未来连接证书

时间:2015-10-04 15:23:52

标签: android ssl httpsurlconnection

在Android上使用HttpsUrlConnection,如果我连接到具有不受信任证书的服务器,很可能是自签名证书,我将收到错误。 例如,当在浏览器中发生类似的事情时,无论如何我都可以选择接受该证书。

  1. 计划是正常运行URL连接。
  2. 如果出现证书错误,请使用Dummy"信任所有"重新运行它。 设置,当然仍然打破了连接 已收到证书(在X509TrustManager和 然后是HostNameVerifier)。在HostNameVerifier中返回false 这很巧妙。
  3. 询问用户是否确实要使用此证书。
  4. 现在,如何将此证书添加到应用程序的商店,以便在下次与该服务器建立连接时使用它?

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

    换句话说。

    1. 从服务器(已完成)中检索公共证书
    2. 无论如何都要询问用户是否要使用它。
    3. 在应用程序自己的商店中的某个地方导入公共证书,以便在将来的连接中使用。
    4. 回退到所有CA可信证书的常规信任链。
    5. 因为我已经在所有其他问题中看到了这个问题,因为人们开始提供所有错误的解决方案。我 NOT 想要一个AcceptAllVerifier。我可以使用任何需要我手动导入证书的内容。

1 个答案:

答案 0 :(得分:0)

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

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

Does Android Volley support SSL?

Volley SSL - Hostname was not verified

希望这有帮助!