HttpURLConnection
とHttpsURLConnection
を使用して「https」に接続しようとすると、どのような違いがありますか?
HttpURLConnection
とHttpsURLConnection
の両方を使用して「https」に接続できたので、混乱しています。 HttpsURLConnection?
を使用した場合にのみ、「https」への接続を確立できると思いました
以下は私の質問のいくつかです:
SSLSocketFactory
にHostnameVerifier
とHttpURLConnection
がなかったので、SSLSocketFactory
とHostnameVerifier
は何ですか使ってる?テストとしてコードを書いたところです(以下を参照)。最終的に発生するのは、URL.openConnection()呼び出しにより、libcore.net.http.HttpsURLConnectionImplクラスが返されることです。
これはHttpsURLConnectionの実装ですが、HttpsURLConnectionはHttpURLConnectionを継承しています。ですから、あなたは多形性が働いているのを見ています。
デバッガーをさらに調べると、クラスはデフォルトのファクトリメソッドを使用しているようです。
hostnameVerifier = javax.net.ssl.DefaultHostnameVerifier
sslSocketFactory = org.Apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl
これに基づくと、デフォルトの動作が使用されているように見えます。それがすべてを信頼しているのかどうかはわかりませんが、HTTPS接続を確実に確立しています。
接続に関するドキュメントのヒントは、よく知られているが自己署名されていないCAを自動信頼します。 (以下を参照)私はこれをテストしませんでしたが、 ここでそれを達成する方法 にサンプルコードがあります。
アプリケーションがシステムの一部ではない認証局(CA)証明書を信頼する場合は、HttpsURLConnectionに設定されたSSLSocketFactoryを介して独自のX509TrustManagerを指定する必要があります。
Runnable r = new Runnable() {
public void run() {
try {
URL test = new URL("https://www.google.com/");
HttpURLConnection connection = (HttpURLConnection) test.openConnection();
InputStream is = connection.getInputStream();
StringWriter sw = new StringWriter();
String value = new Java.util.Scanner(is).useDelimiter("\\A").next();
Log.w("GOOGLE", value);
} catch(Exception e) {
Log.e("Test", e.getMessage());
}
}
};
Thread t = new Thread(r);
t.start();