在我正在开发的应用程序中,我必须建立到web服务器的HTTPS连接。我收到了证书不可信的错误,在查阅了stackoverflow之后,我发现了这篇博客文章:http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/
此服务器的CA似乎未包含在Android的默认存储中。简而言之,我下载了所有证书,使用BKS提供程序创建了密钥库,导入了密钥,将密钥库导入到我的项目中,对DefaultHttpClient类进行了子类化以强制它使用我的密钥库。
在遵循了博客中的步骤之后,它在模拟器上完美地工作了。然而,当我在设备上测试它时,它间歇性地失败。我想我已经分离出了一个模式。似乎过了一段时间后,我尝试建立HTTPS连接,它将失败。然后,如果我再次尝试相同的连接,它将成功。如果我等待一段时间,然后重试,第一次失败,重复尝试就成功了。我可能可以通过多次尝试失败来修复它,但我想知道发生了什么。这种行为暗示着某种缓存,但我不知道如何找到它或修改它的行为。有没有人对发生了什么有什么建议,或者知道我做错了什么?任何帮助都将不胜感激。
发布于 2011-05-05 17:01:47
我解决了一个类似的问题,通过设置
System.setProperty("http.keepAlive", "false");在我做HTTP调用之前。Android在其连接池中保持关闭的连接并尝试重用它们似乎存在问题。
发布于 2011-03-31 03:31:26
您可以“跳过”证书。是的,你会失去安全性,但有时这是唯一的解决方案……
做这件事。首先,声明一个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上下文:
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());希望能对你有所帮助。
https://stackoverflow.com/questions/5491216
复制相似问题