Использование HttpURLConnection и HttpsURLConnection для подключения к https? - PullRequest
26 голосов
/ 01 апреля 2012

В чем различия, если я пытаюсь подключиться к "https", используя HttpURLConnection и HttpsURLConnection?

Мне удалось подключиться к «https», используя HttpURLConnection и HttpsURLConnection, поэтому я запутался. Я думал, что могу установить соединение с «https» только если я использовал HttpsURLConnection?

Ниже приведены некоторые мои вопросы:

  • Если мне удалось открыть соединение с «https» с помощью HttpURLConnection, мое соединение все еще находится в «https» или оно становится «http»?
  • Как насчет проверки сертификатов? Поскольку у меня не было SSLSocketFactory и HostnameVerifier на моем HttpURLConnection при подключении к «https», что SSLSocketFactory и HostnameVerifier я использую?
  • Значит ли это, что я доверяю всему, независимо от того, является ли сертификат доверенным или нет?

1 Ответ

21 голосов
/ 01 апреля 2012
  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) сертификаты, которые не являются частью системы, следует указать его собственный X509TrustManager через набор SSLSocketFactory на HttpsURLConnection.

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();
...