0

我尝试使用以下代码联系 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?

4

1 回答 1

0

我相信它归结为服务器在其 SSL 连接上使用的证书。如果它是由于根 CA 而被 Android 识别的东西(通常这些将是来自更常见来源的证书,例如 Verisign),那么它应该像你在这里一样工作。

另一方面,如果有自定义证书,或自签名的东西,或来自可能较小或不被普遍接受为安全的来源的东西,那么您将不得不创建自定义密钥库来手动处理该证书。

谷歌可能使用前者,这就是你的代码已经工作的原因。

另外,我相信您可以添加

schemeRegistry.register(new Scheme("http", sf, 80));

到您的代码,它也将涵盖 http 连接,而不会对您的应用程序造成任何损害。

于 2012-11-07T13:44:33.650 回答