2012-04-01 14 views
22

Jakie są różnice, jeśli próbuję połączyć się z "https" przy użyciu HttpURLConnection i HttpsURLConnection?Używanie HttpURLConnection i HttpsURLConnection do łączenia się z https?

Udało mi się połączyć z "https" przy użyciu zarówno HttpURLConnection i HttpsURLConnection, więc jestem zdezorientowany. Myślałem, że mogę tylko nawiązać połączenie z „https”, jeśli użyłem HttpsURLConnection?

Poniżej znajdują się niektóre z moich pytań:

  • Gdybym był w stanie otworzyć połączenie z „https” Korzystanie HttpURLConnection, czy moje połączenie jest nadal w "https" lub staje się "http"?
  • Co z weryfikacją certyfikatów? Ponieważ nie miałem żadnych SSLSocketFactory i HostnameVerifier na moim HttpURLConnection podczas łączenia się z "https", co używam SSLSocketFactory i HostnameVerifier?
  • Czy to oznacza, że ​​ufam wszystkim, bez względu na to, czy certyfikat jest zaufany czy nie?

Odpowiedz

17
  1. Używane połączenie HTTPS.
  2. Domyślne zachowania
  3. Nie jestem pewien, ale czytaj poniżej.

Właśnie napisałem jakiś kod jako test (zobacz całą drogę poniżej). To, co się dzieje, to wywołanie URL.openConnection(), które da ci klasę: libcore.net.http.HttpsURLConnectionImpl.

Jest to implementacja połączenia HTTP, ale HttpsURLConnection dziedziczy po HttpURLConnection. Więc widzisz polimorfizm w pracy.

Patrząc dalej w debugger okazuje się, że klasa używa domyślnych metod fabrycznych.

hostnameVerifier = javax.net.ssl.DefaultHostnameVerifier

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

W oparciu o ten wygląda domyślnych zachowań są używane. Nie wiem, czy to oznacza, że ​​ufasz wszystkiemu, ale definitywnie nawiązujesz połączenie HTTPS.

Dokumentacja w postaci wskazówek dotyczących połączenia automatycznie zaufa urzędom CA, które są dobrze znane, ale nie mogą podpisywać się samodzielnie. (patrz poniżej) Nie przetestowałem tego, ale mają przykładowy kod na how to accomplish that here.

Jeśli aplikacja chce zaufać Certificate Authority (CA) certyfikaty, które nie są częścią systemu, należy określić jego własne X509TrustManager poprzez SSLSocketFactory ustawionej na 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(); 
+0

Dzięki! Próbowałem połączyć się z różnymi stronami https za pomocą Twojego kodu. Domyślnym działaniem SSLSocketFactory jest akceptowanie tylko certyfikatów podpisanych przez CA. Otrzymałem certyfikat sun.security.validator.ValidatorException, gdy próbowałem połączyć się z witryną, której certyfikat jest samopodpisany. Dziękuję za wyjaśnienie! – Arci

+1

Rozumiem, więc jeśli wiesz, że serwer akceptuje tylko identyfikatory URI HTTPS, możesz bezpiecznie użyć 'HttpURLConnection', aby wykonać swoje żądania? – Micro

Powiązane problemy