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

时间:2011-12-28 14:53:48

标签: android ssl https certificate

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

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

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

2 个答案:

答案 0 :(得分:1)

纯粹的推测,但是我在一段时间内在类似的情况下仍处于类似状态,这种情况在证书间歇性失败的Windows / IE环境中。在这两种情况下,我都有代理,我没有意识到代理干扰。

第一个是Fiddler - 一个Web调试器,当我使用它时,它将证书代理到浏览器。

我第二次遇到我们的企业互联网过滤解决方案(Web Sense)也存在问题,它也可以作为代理,但它会在最初尝试时正确地提供证书信息。

我不知道这是不是你的情况,但这是我唯一一次看到你所描述的行为。

答案 1 :(得分:0)

在打开连接之前,您可以创建一个不验证证书链的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();
    }
}

`