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 错误:证书不受信任...有时的主要内容,如果未能解决你的问题,请参考以下文章