【发布时间】:2011-07-05 04:59:08
【问题描述】:
我正在使用 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 东西对我来说很难。
【问题讨论】:
-
我使用 HttpClient 访问 HTTPS 没有问题。我只是在使用 BasicHttpParams 和 DefaultHttpClient,ClientConnectionManager 或 SchemeRegistry 都没有……对你来说有必要吗?
-
证书需要验证。不推荐安装“无检查”TrustManager,否则使用 ssl 的意义何在?我想确定我正在连接到正确的主机并且证书没有经过修改。不过感谢您的链接。
-
在查看博客、java 代码和 android 源代码一周后,发现问题出在我连接的站点上的 ssl 证书的排序上。因此,如果您遇到证书验证问题,请务必仔细检查证书是否以正确的顺序呈现给您,以及根证书是否存在于 android 设备上!
标签: android ssl https keystore