在我正在处理的应用程序中,我必须与Web服务器建立HTTPS连接。我得到证书不可信任的错误,在咨询stackoverflow后,我发现这篇博文: http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/
此服务器的CA似乎未包含在Android的默认存储中。简而言之,我下载了所有证书,使用BKS提供程序创建了一个密钥库,导入了密钥,将密钥库导入到我的项目中,继承了DefaultHttpClient类以强制它使用我的密钥库。
按照博客中的步骤操作后,它在模拟器上完美运行。但是,当我在设备上测试时,它会间歇性地失败。我想我已经孤立了一个模式。似乎经过一段时间后我尝试建立HTTPS连接,它将失败。然后,如果我再次尝试相同的连接,它将成功。如果我等待一段时间然后再试一次,它会在第一次失败,成功重复尝试。我可以通过多次尝试失败来修复它,但我想知道发生了什么。行为表明某种缓存,但我不知道如何找到它或修改它的行为。有没有人对正在发生的事情有任何建议或知道我做错了什么?任何帮助将不胜感激。
答案 0 :(得分:4)
我通过设置
解决了类似的问题System.setProperty("http.keepAlive", "false");
在我进行HTTP调用之前。 Android保持关闭连接并尝试重用它们似乎存在问题。
答案 1 :(得分:0)
您可以“跳过”证书。是的,你会失去安全感但有时它是唯一的解决方案......
要做到这一点。首先,声明一个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());
我希望能帮助你。