【问题标题】:Android SSL error: certificate not trusted…sometimesAndroid SSL 错误:证书不受信任……有时
【发布时间】:2012-01-29 06:04:36
【问题描述】:
在我正在开发的应用程序中,我必须与 Web 服务器建立 HTTPS 连接。我收到证书不受信任的错误,在咨询了 stackoverflow 后,我发现了这篇博文:http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/
该服务器的 CA 似乎未包含在 Android 的默认商店中。简而言之,我下载了所有证书,使用 BKS 提供程序创建了一个密钥库,导入了密钥,将密钥库导入到我的项目中,继承了 DefaultHttpClient 类以强制它使用我的密钥库。
按照博客中的步骤操作后,它在模拟器上完美运行。但是,当我在设备上对其进行测试时,它会间歇性地失败。我想我已经隔离了一个模式。好像过了一段时间后,我尝试建立一个 HTTPS 连接,它会失败。然后,如果我再次尝试相同的连接,它将成功。如果我等待一段时间然后再试一次,它第一次失败,重复尝试成功。我可以通过多次尝试失败来解决它,但我想知道发生了什么。该行为暗示了某种缓存,但我不知道如何去寻找它或修改它的行为。有没有人对正在发生的事情有任何建议或知道我做错了什么?任何帮助将不胜感激。
【问题讨论】:
标签:
android
ssl
https
certificate
【解决方案1】:
纯属猜测,但不久前我在证书间歇性失败的 Windows/IE 环境中处理过类似的情况。在这两种情况下,我都有代理,但我没有意识到代理会干扰。
第一个是 Fiddler - 一个网络调试器,当我使用它时,它会将证书代理到浏览器。
第二次我的公司互联网过滤解决方案 (Web Sense) 也充当代理时遇到问题,有点像 - 它最终会允许证书信息正确通过,但在第一次尝试时不会。
我不知道这是否是您的情况,但这是我唯一一次看到您所描述的行为。
【解决方案2】:
在打开连接之前,您可以创建一个不验证证书链的TrustManager,并将其安装到您的 HttpsURLConnection。见下文:
`
private static void trustAllHosts() {
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[] {};
}
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
} };
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection
.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}
}
`