web-dev-qa-db-ja.com

HttpURLConnectionとHttpsURLConnectionを使用してhttpsに接続しますか?

HttpURLConnectionHttpsURLConnectionを使用して「https」に接続しようとすると、どのような違いがありますか?

HttpURLConnectionHttpsURLConnectionの両方を使用して「https」に接続できたので、混乱しています。 HttpsURLConnection?を使用した場合にのみ、「https」への接続を確立できると思いました

以下は私の質問のいくつかです:

  • HttpURLConnectionを使用して「https」への接続を開くことができた場合、接続はまだ「https」にありますか、それとも「http」になりますか?
  • 証明書の検証はどうですか? 「https」に接続しているときにSSLSocketFactoryHostnameVerifierHttpURLConnectionがなかったので、SSLSocketFactoryHostnameVerifierは何ですか使ってる?
  • 証明書が信頼されているかどうかに関係なく、すべてを信頼しているということですか?
26
Arci
  1. 使用されているHTTPS接続。
  2. デフォルトの動作
  3. わかりませんが、以下をお読みください。

テストとしてコードを書いたところです(以下を参照)。最終的に発生するのは、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();
21
Jeremy Edwards