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

android上的不受信任证书错误和httpclient,android,ssl,https,keystore,Android,Ssl,Https,Keystore,我正在使用ApacheHttpClient库来设置https连接。不幸的是,Android给了我一个“不受信任的服务器证书”错误。如果我使用手机浏览器浏览站点,它会正确验证证书,这让我相信我需要让HttpClient“知道”手机上的根证书。这是我的HttpClient设置代码: HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout( params, 20000 ); HttpCo

我正在使用ApacheHttpClient库来设置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的东西对我来说相当困难。

我以前也有同样的问题

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


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

证书可以包含具有颁发者证书URL的特殊授权信息访问扩展()。大多数浏览器可以使用AIA扩展下载缺少的中间证书,以完成证书链。但一些客户端(移动浏览器、OpenSSL)不支持此扩展,因此它们报告此类证书不受信任

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


您应该能够从颁发者处获取中间证书,并自己将它们连接在一起。我已经编写了一个脚本来自动化这个过程,它在AIA扩展上循环以生成正确链接的证书的输出

继zakjan的回答之后,我在android webview中尝试使用jquery在新安全的服务器上执行AJAX请求时遇到了一个问题。它在浏览器中起作用,但在我的应用程序中不起作用

我使用了这个网站:

我粘贴了从Comodo(positiveSSL)那里得到的签名.crt文件的文本,它给了我所需要的所有内容的浓缩。我将其保存为我的域+“chain.crt”(见下文)

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

SSLEngine On
SSLCertificateFile /etc/ssl/localcerts/example_com.crt
SSLCertificateKeyFile /etc/ssl/localcerts/example.com.key
SSLCACertificateFile /etc/ssl/localcerts/example.com.chain.crt
之后,我的Android应用程序的webview在使用ajax发布到我的服务器时没有问题。我在两个真实世界的设备上试用过,一个运行2.3.4,一个运行4.4之类的。在运行2.3的模拟器上。一切顺利


我希望这能有所帮助。

我使用HttpClient访问HTTPS没有问题。我只是使用BasicHttpParams和DefaultHttpClient,而不是ClientConnectionManager或SchemeRegistry。。。这对你有必要吗?证书需要验证。不建议安装“不检查”TrustManager,否则使用ssl有什么意义?我想确保我连接到了正确的主机,并且证书没有被篡改。谢谢你的链接。在浏览了一周的博客、java代码和android源代码之后,我发现问题出在我连接的站点上ssl证书的排序上。因此,如果您遇到证书验证问题,请始终仔细检查证书是否以正确的顺序提供给您,以及根证书是否存在于android设备上!不要在生产中这样做!您正在关闭所有SSL保护。这只能用于内部测试。任何人都可以拒绝你的请求并窃取所有敏感信息。我想补充一点,现在谷歌拒绝了所有试图绕过这一步骤的应用。感谢你的评论,你的工具最终帮助我解决了一个问题。