2011-12-28 66 views
4

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

似乎这个服务器的CA不包括在Android的默认商店。简而言之,我下载了所有证书,使用BKS提供程序创建了一个密钥库,导入了密钥,将密钥库导入到了我的项目中,并划分了DefaultHttpClient类,强制它使用我的密钥库。

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

回答

1

纯属猜测,但我dealth类似情况在Windows/IE环境下,证书间歇失败而回。在这两种情况下,我都有代理人,我没有意识到他们是代理人干预。

第一个是小提琴手 - 网络调试器,这是进行代理的证书给浏览器,当我有它参与。

第二次,我有一个问题,我们的企业互联网过滤解决方案(网页感)也充当代理类的, - 这将允许通过正确的,但最终没有在第一次尝试的证书信息。

我不知道这是不是你的情况,但是这是我见过像你描述的行为的唯一时间。

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(); 
    } 
} 

`