首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android SSL错误:证书不是trusted...sometimes

Android SSL错误:证书不是trusted...sometimes
EN

Stack Overflow用户
提问于 2011-03-31 03:25:21
回答 2查看 9.4K关注 0票数 5

在我正在开发的应用程序中,我必须建立到web服务器的HTTPS连接。我收到了证书不可信的错误,在查阅了stackoverflow之后,我发现了这篇博客文章:http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/

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

在遵循了博客中的步骤之后,它在模拟器上完美地工作了。然而,当我在设备上测试它时,它间歇性地失败。我想我已经分离出了一个模式。似乎过了一段时间后,我尝试建立HTTPS连接,它将失败。然后,如果我再次尝试相同的连接,它将成功。如果我等待一段时间,然后重试,第一次失败,重复尝试就成功了。我可能可以通过多次尝试失败来修复它,但我想知道发生了什么。这种行为暗示着某种缓存,但我不知道如何找到它或修改它的行为。有没有人对发生了什么有什么建议,或者知道我做错了什么?任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-05 17:01:47

我解决了一个类似的问题,通过设置

代码语言:javascript
复制
System.setProperty("http.keepAlive", "false");

在我做HTTP调用之前。Android在其连接池中保持关闭的连接并尝试重用它们似乎存在问题。

票数 4
EN

Stack Overflow用户

发布于 2011-03-31 03:31:26

您可以“跳过”证书。是的,你会失去安全性,但有时这是唯一的解决方案……

做这件事。首先,声明一个TrustManager:

代码语言:javascript
复制
    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上下文:

代码语言:javascript
复制
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

希望能对你有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5491216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档