2011-03-30 56 views
5

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

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

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

回答

4

我通过设置

System.setProperty("http.keepAlive", "false"); 

之前,我做了我的HTTP调用解决了类似的问题。 Android在连接池中保持关闭连接并试图重用它们似乎存在问题。

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

我希望你的帮助。

+1

我终于决定把连接尝试放入循环三次。到目前为止,它总是在第二次尝试。哈克,但我仍然可以使用证书。仍然不知道发生了什么事。 – d370urn3ur 2011-03-30 21:56:06

+0

它适合我! – 2012-12-07 07:46:04

+1

如果您接受所有证书,请提醒用户。知道你绕过安全是他们的权利。 – Krylez 2013-01-15 19:23:09