我尝试使用以下代码联系https服务器:
HttpResponse response = new DefaultHttpClient().execute(new HttpGet("https://www.google.com"));
它完美无缺(它返回谷歌页面和状态代码200 OK)。
我还尝试使用以下服务器联系同一台服务器:
BasicHttpParams clientparams = new BasicHttpParams();
[... clientparams initializazion...]
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
SSLSocketFactory sf = SSLSocketFactory.getSocketFactory();
sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
schemeRegistry.register(new Scheme("https", sf, 443));
ClientConnectionManager cm = new ThreadSafeClientConnManager(clientparams, schemeRegistry);
HttpClient myClient = new DefaultHttpClient(cm, clientparams);
HttpResponse response = myClient.execute(new HttpGet("https://www.google.com"));
这也很有效。我也尝试过其他服务器并且总是有效。
然后,当我需要使用SchemeRegistry来初始化http客户端时,有人可以向我解释一下吗?而且,在哪些情况下,有必要使用自定义KeyStore对SSLSocketFactory进行初始化?
答案 0 :(得分:0)
我认为它归结为服务器在其SSL连接上使用的证书。如果它是Android识别的因为是根CA(通常这些将是来自更常见的来源的证书,例如Verisign),那么它应该像你在这里一样工作。
另一方面,如果存在自定义证书或自签名的内容,或来自可能较小或通常不被认为是安全的来源的某些内容,则您必须创建自定义密钥库以手动处理那个证书。
Google可能会使用前者,这就是您的代码已经运行的原因。
另外,我相信你可以添加
schemeRegistry.register(new Scheme("http", sf, 80));
代码,它也将覆盖http连接,而不会对您的应用程序造成任何伤害。