2012-04-01 22 views
22

¿Cuáles son las diferencias si trato de conectarme a un "https" usando HttpURLConnection y HttpsURLConnection?Usando HttpURLConnection y HttpsURLConnection para conectarse a un https?

Pude conectarme a "https" usando HttpURLConnection y HttpsURLConnection, así que estoy confundido. Pensé que sólo puede establecer una conexión con un "https" si utilicé HttpsURLConnection?

A continuación se presentan algunas de mis preguntas:

  • Si yo era capaz de abrir una conexión a un "https" usando HttpURLConnection, ¿Mi conexión aún está en "https" o se convierte en "http"?
  • ¿Qué tal la validación de certificados? Como no hice ninguna SSLSocketFactory y HostnameVerifier en mi HttpURLConnection mientras me conecto a un "https", ¿qué SSLSocketFactory y estoy usando?
  • ¿Significa que confío en todo independientemente de si el certificado es confiable o no?

Respuesta

17
  1. HTTPS conexión que se utiliza.
  2. Comportamientos predeterminados
  3. No estoy seguro, pero lea a continuación.

Acabo de escribir algunos códigos como prueba (ver todo el camino a continuación). Lo que termina sucediendo es la llamada URL.openConnection() que le devolverá una clase libcore.net.http.HttpsURLConnectionImpl.

Esta es una implementación de HttpsURLConnection pero HttpsURLConnection hereda de HttpURLConnection. Entonces, estás viendo el polimorfismo en el trabajo.

Mirando más hacia el depurador, parece que la clase está utilizando los métodos de fábrica predeterminados.

hostnameVerifier = javax.net.ssl.DefaultHostnameVerifier

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

Con base en esta parece que los comportamientos predeterminados están siendo utilizados. No sé si eso significa que confías en todo, pero definitivamente estás estableciendo una conexión HTTPS.

La documentación da una pista sobre la conexión de las CA de confianza automática que son bien conocidas pero no autofirmadas. (ver a continuación) No probé esto, pero tienen código de ejemplo en how to accomplish that here.

Si una aplicación quiere confiar en la autoridad de certificación (CA) certificados que no son parte del sistema, debe especificar su propia X509TrustManager a través de un SSLSocketFactory establecido en el 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

¡Gracias! Intenté conectarme a diferentes sitios web https usando tu código. El comportamiento predeterminado de SSLSocketFactory es aceptar solo certicados firmados por CA. Recibí un sun.security.validator.ValidatorException cuando intenté conectarme a un sitio web cuyo certificado está autofirmado. ¡Gracias por la aclaración! – Arci

+1

Veo, entonces, si sabe que el servidor solo acepta HTTPS URI, ¿puede usar 'HttpURLConnection' de forma segura para hacer sus solicitudes? – Micro

Cuestiones relacionadas