Android SSL 错误:证书不受信任...有时

Posted

技术标签:

【中文标题】Android SSL 错误:证书不受信任...有时【英文标题】:Android SSL error: certificate not trusted...sometimes 【发布时间】:2011-03-30 19:25:21 【问题描述】:

在我正在开发的应用程序中,我必须与 Web 服务器建立 HTTPS 连接。我收到了证书不受信任的错误,在咨询了 *** 之后,我发现了这篇博文: http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/

该服务器的 CA 似乎未包含在 Android 的默认商店中。简而言之,我下载了所有证书,使用 BKS 提供程序创建了一个密钥库,导入了密钥,将密钥库导入到我的项目中,继承了 DefaultHttpClient 类以强制它使用我的密钥库。

按照博客中的步骤操作后,它在模拟器上完美运行。但是,当我在设备上对其进行测试时,它会间歇性地失败。我想我已经隔离了一个模式。似乎过了一段时间后,我尝试建立 HTTPS 连接,它会失败。然后,如果我再次尝试相同的连接,它将成功。如果我等待一段时间然后再试一次,它第一次失败,重复尝试成功。我可能可以通过多次尝试失败来解决它,但我想知道发生了什么。该行为暗示了某种缓存,但我不知道如何去寻找它或修改它的行为。有没有人对正在发生的事情有任何建议或知道我做错了什么?任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我通过设置解决了类似的问题

System.setProperty("http.keepAlive", "false");

在我进行 HTTP 调用之前。 Android 在其连接池中保持关闭的连接并尝试重用它们似乎存在问题。

【讨论】:

【参考方案2】:

您可以“跳过”证书。是的,您会失去安全性,但有时这是唯一的解决方案...

这样做。首先,声明一个 TrustManager:

    private TrustManager[] trustAllCerts = new TrustManager[]  new X509TrustManager()
    
        public java.security.cert.X509Certificate[] getAcceptedIssuers()
        
            return null;
        

        public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
        

        

        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
        

        
    
;

其次,更改 SSL Context:

            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

希望对你有帮助。

【讨论】:

我最终决定将连接尝试放在一个循环三遍的循环中。到目前为止,它总是在第二次尝试时起作用。哈基,但我仍然可以使用证书。还是不知道怎么回事。 如果您接受所有证书,请警告用户。他们有权知道您正在绕过安全措施。

以上是关于Android SSL 错误:证书不受信任...有时的主要内容,如果未能解决你的问题,请参考以下文章

iOS 10.3下解决Charles抓包ssl证书信任问题

iOS MDM 服务器 SSL 证书不受设备信任

允许 Java 使用不受信任的证书进行 SSL/HTTPS 连接

怎样的ssl证书才能被信任?

解决Charles抓包ssl证书信任问题

服务器证书不受信任怎么解决