android上不受信任的证书错误和httpclient

时间:2011-02-27 11:08:28

标签: android ssl https keystore

我正在使用Apache HttpClient库来设置https连接。不幸的是Android给了我一个“不值得信任的服务器证书”错误。如果我使用手机浏览器浏览网站,它会正确验证证书,这让我相信我需要让HttpClient“知道”手机上的根证书。这是我的HttpClient设置代码:

HttpParams params = new BasicHttpParams();

HttpConnectionParams.setConnectionTimeout( params, 20000 );
HttpConnectionParams.setSoTimeout( params, 20000 );

HttpProtocolParams.setVersion( params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset( params, HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue( params, false);

SchemeRegistry schReg = new SchemeRegistry();
schReg.register( new Scheme( "http", PlainSocketFactory.getSocketFactory(), 80 ) );
schReg.register( new Scheme( "https", SSLSocketFactory.getSocketFactory(), 443 ) );

ClientConnectionManager conMgr = new ThreadSafeClientConnManager( params, schReg );

DefaultHttpClient defaultHttpClient = new DefaultHttpClient( conMgr, params );

return ( defaultHttpClient );

正如您所看到的,我对SSLSocketFactory没有任何特别之处。如何在不在密钥库中添加自定义证书的情况下使HttpClient库验证我的站点?我应该创建自定义SSLSocketFactory并从Android手机加载cacerts.bks吗?在这种情况下,我可能会遇到不同手机上密钥库的不同密码问题?

如果您需要更多信息,请与我们联系。这个SSL的东西对我来说非常困难。

3 个答案:

答案 0 :(得分:3)

我相信您的证书不包含验证系统受信任根证书路径所需的所有中间证书。可以通过某些SSL配置验证工具将其报告为不完整的证书链

证书可以包含特殊的授权信息访问扩展名(RFC-3280),其中包含发行者证书的URL。大多数浏览器都可以使用AIA扩展来下载缺少的中间证书来完成证书链。但是有些客户端(移动浏览器,OpenSSL)不支持此扩展,因此他们会将此类证书报告为不受信任。

您可以通过将证书中的所有证书连接到受信任的根证书(按此顺序排除)来手动解决不完整证书链问题,以防止出现此类问题。请注意,受信任的根证书不应该存在,因为它已包含在系统的根证书存储区中。

您应该能够从发卡行获取中间证书,并自己将它们连接在一起。我编写了一个脚本来自动执行该过程,它循环遍历AIA扩展以生成正确链接证书的输出。 https://github.com/zakjan/cert-chain-resolver

答案 1 :(得分:0)

跟进zakjan的回答,当我尝试在我的新安全服务器上使用jquery在Android webview中执行AJAX请求时遇到了问题。它在浏览器中工作,但不在我的应用程序中。

我使用过这个网站:https://certificatechain.io/

我粘贴在我从Comodo(positiveSSL)回来的签名.crt文件的文本中,它让我回想起我需要的一切。我把它保存为我的域名+“chain.crt”(见下文)

然后,在我的apache配置中,我为特定的虚拟主机输入了类似的内容:

  #itinerary table.formTable:not(:nth-child(2)):after {
    content: "";
    border-top: 1px solid #999999;
    width: 100%;
    position: relative;
    margin-top: -130px;
    margin-left: 17px;
    display: block;
  }

之后,我的Android应用程序的webview使用ajax POST到我的服务器没有问题。我在2个真实世界的设备上试过它,一个运行2.3.4,一个运行4.something。并在运行2.3的模拟器上。一切顺利。

我希望这会有所帮助。

答案 2 :(得分:-2)

我之前有同样的问题..

你可以使用这个答案,它对我很有用..

Trusting all certificates using HttpClient over HTTPS