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

时间:2011-03-30 19:25:21

标签: android ssl-certificate

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

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

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

2 个答案:

答案 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());

我希望能帮助你。