2016-03-07 9 views
0

Я тестирую javax.net.ssl.HttpsURLConnection. Поскольку программа делает запрос HTTPS, поэтому я подумал, что должен сделать setSSLSocketFactory, чтобы сделать запрос работы.Java HttpsURLConnection успешно выполнен без установки setSSLSocketFactory

НО программа работать нормально без setSSLSocketFactory установки:

Вот мой код:

public class HttpsTest { 

    public static void main(String[] args) { 

     try { 

      URL requestUrl = new URL("https://www.google.com/?gws_rd=ssl"); 
      HttpsURLConnection conn = (HttpsURLConnection) requestUrl.openConnection(); 

      // conn.setSSLSocketFactory(sslSocketFactory); 

      BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); 

      String line; 
      while ((line = br.readLine()) != null) { 
       System.out.println(line); 
      } 

      System.out.println("getResponseCode: " + conn.getResponseCode()); 

      br.close(); 
      conn.disconnect(); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     // RESULT: 

     // Some HTML return by https://www.google.com/?gws_rd=ssl 
     // getResponseCode: 200 OK 
    } 
} 

Что я неправильно о Https? Почему программа работала без настройки sslSocketFactory? (HttpsURLConnection необходимо sslSocketFactory для проверки открытого сертификата SSL/TLS, отправленного сервером)

Спасибо!

ответ

1

Я думал, что я должен был сделать setSSLSocketFactory() для того, чтобы сделать запрос РАБОТУ

нет. Он имеет значение по умолчанию.

+0

Спасибо EJP! – Loc

+0

Hi EJP: Что делать, если фабрика по умолчанию не может проверить открытый сертификат, отправленный сервером? Должен ли я обрабатывать этот случай для моего запроса Https? Благодаря! – Loc

+1

Тогда у вас есть два варианта: используйте setSSLSocketFactory() или добавьте сертификат сервера или один из центров сертификации в цепочке сертификатов сервера к хранилищу ключей JVM по умолчанию как «доверенный». Процедура для последнего будет специфичной для платформы. –

1

Поведение по умолчанию заключается в использовании полномочий сертификатов, которые поставляются с вашей установкой Java. Тот факт, что все работает из коробки, означает, что удаленный хост использует сертификат, подписанный центром сертификации (не является самоподписанным).

Вам нужно только переопределить это поведение по умолчанию, если вы хотите использовать альтернативные центры сертификации или разрешить самозаверяющему сертификату в качестве действительного сертификата Java.

+0

Вам не нужно переопределять его даже тогда. Вы можете просто использовать другое доверительное хранилище через системные свойства. Есть и другие причины, по которым вы, возможно, захотите его переопределить. – EJP

+0

Спасибо Uku Loskit! – Loc

+0

Я бы сказал, что это сильно зависит от среды программирования (в некоторых случаях это может быть невозможно сделать с помощью свойств системы). Например, в Android. –