Подтвердить что ты не робот

Используя HttpURLConnection и HttpsURLConnection для подключения к https?

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

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

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

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

Ответ 1

  • Используется соединение HTTPS.
  • Поведение по умолчанию
  • Не уверен, но читайте ниже.

Я просто написал код в качестве теста (см. все ниже). Что в итоге происходит, так это вызов URL.openConnection() даст вам класс libcore.net.http.HttpsURLConnectionImpl.

Это реализация HttpsURLConnection, но HttpsURLConnection наследуется от HttpURLConnection. Таким образом, вы видите полиморфизм на работе.

Посмотрев дальше в отладчик, кажется, что класс использует методы factory по умолчанию.

hostnameVerifier = javax.net.ssl.DefaultHostnameVerifier

sslSocketFactory = org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl

Основываясь на этом, похоже, что используется поведение по умолчанию. Я не знаю, означает ли это, если вы доверяете всему, но вы определенно устанавливаете соединение HTTPS.

Документация, в которой видны подсказки при подключении, будет автоматически доверять ЦС, которые хорошо известны, но не самоподписываются. (см. ниже) Я не тестировал это, но у них есть пример кода на как это сделать здесь.

Если приложение хочет доверять центру сертификации (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();