【问题标题】:Android HTTPS requests, doubts on the correct usageAndroid HTTPS 请求,正确使用方式存疑
【发布时间】:2012-11-07 12:08:28
【问题描述】:

我尝试使用以下代码联系 https 服务器:

HttpResponse response = new DefaultHttpClient().execute(new HttpGet("https://www.google.com"));

它运行良好(它返回 google 页面和状态码 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?

【问题讨论】:

    标签: android http https keystore


    【解决方案1】:

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

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

    Google 可能会使用前者,这就是您的代码已经工作的原因。

    另外,我相信你可以添加

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多