0

次のコードでhttpsサーバーに接続しようとしました。

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

そしてそれは完全に動作します(それはグーグルページとステータスコード200OKを返します)。

また、次のサーバーで同じサーバーに接続しようとしました。

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クライアントを初期化する必要がある場合、誰かが私に説明できますか?また、どのような場合に、SSLSocketFactoryをカスタムKeyStoreで初期化する必要がありますか?

4

1 に答える 1

0

サーバーがSSL接続で使用している証明書に帰着すると思います。これがルートCAであるためにAndroidが認識するものである場合(通常、これらはVerisignなどのより一般的なソースからの証明書になります)、ここにあるように機能するはずです。

一方、カスタム証明書、自己署名、または小さいか一般的に安全であると認められていないソースからの何かがある場合は、その証明書を手動で処理するためのカスタムキーストアを作成する必要があります。

Googleは前者を使用している可能性が高いため、コードはすでに機能しています。

また、追加できると思います

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

コードに追加すると、アプリケーションに害を及ぼすことなくhttp接続もカバーされます。

于 2012-11-07T13:44:33.650 に答える