我正在尝试使用 HTTPS 连接HttpClient
lib,但问题是,由于证书不是由公认的证书颁发机构(CA)签署的,例如Verisign,全局标志等,列在 Android 可信证书集中,我不断收到javax.net.ssl.SSLException: Not trusted server certificate
.
我见过一些解决方案,您只需接受所有证书,但如果我想询问用户怎么办?
我想要一个类似于浏览器的对话框,让用户决定是否继续。最好我想使用与浏览器相同的证书库。有任何想法吗?
您需要做的第一件事是设置验证级别。
这样的水平并不多:
- ALLOW_ALL_HOSTNAME_VERIFIER
- BROWSER_COMPATIBLE_HOSTNAME_VERIFIER
- STRICT_HOSTNAME_VERIFIER
虽然 setHostnameVerifier() 方法对于新库 apache 来说已经过时,但是对于 Android SDK 中的版本来说是正常的。
所以我们采取ALLOW_ALL_HOSTNAME_VERIFIER
并将其设置在方法工厂中SSLSocketFactory.setHostnameVerifier()
.
接下来,您需要将我们的工厂协议设置为 https。为此,只需调用SchemeRegistry.register()
method.
然后你需要创建一个DefaultHttpClient
with SingleClientConnManager
。
另外,在下面的代码中您可以看到默认情况下也会使用我们的标志(ALLOW_ALL_HOSTNAME_VERIFIER
)通过方法HttpsURLConnection.setDefaultHostnameVerifier()
下面的代码对我有用:
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
DefaultHttpClient client = new DefaultHttpClient();
SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
registry.register(new Scheme("https", socketFactory, 443));
SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry);
DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams());
// Set verifier
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
// Example send http request
final String url = "https://encrypted.google.com/";
HttpPost httpPost = new HttpPost(url);
HttpResponse response = httpClient.execute(httpPost);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)