¿Cuáles son las diferencias si intento conectarme a un «https» mediante HttpURLConnection y HttpsURLConnection?

Yo era capaz de conectar a «https» la utilización de ambos HttpURLConnection y HttpsURLConnection así que estoy confundido. Pensé que sólo puede establecer una conexión a un «https» si he utilizado HttpsURLConnection?

A continuación están algunas de mis preguntas:

  • Si yo era capaz de abrir una conexión a un «https» mediante HttpURLConnection, es mi conexión sigue en «https» o no es «http»?
  • Cómo acerca de la validación de los certificados? Ya que yo no cualquier SSLSocketFactory y HostnameVerifier en mi HttpURLConnection mientras se conecta a un «https», lo que SSLSocketFactory y HostnameVerifier estoy utilizando?
  • Significa que estoy confiando en todo lo que independientemente de si el certificado es de confianza o no?
InformationsquelleAutor Arci | 2012-04-01

1 Comentario

  1. 21
    1. Conexión HTTPS ser utilizado.
    2. Comportamientos Predeterminados
    3. No estoy seguro, pero leer a continuación.

    Acabo de escribir algo de código como una prueba (ver más abajo). Lo que termina sucediendo es que el URL.openConnection() llamada le va a devolver un libcore.net.http.HttpsURLConnectionImpl clase.

    Esta es una aplicación de HttpsURLConnection pero HttpsURLConnection hereda de HttpURLConnection. Así que usted está viendo polimorfismo en el trabajo.

    De mirar hacia adelante en el depurador parece que la clase está utilizando el valor predeterminado de fábrica métodos.

    hostnameVerifier = javax.net.ssl.DefaultHostnameVerifier

    sslSocketFactory = org.apache.la armonía.xnet.proveedor de.jsse.OpenSSLSocketFactoryImpl

    Basado en esto se parece a los comportamientos predeterminados están siendo utilizados. No sé si eso significa que si usted está confiando en todo, pero que son sin duda el establecimiento de una conexión HTTPS.

    La documentación de la clase de sugerencias en la conexión de auto-confianza CAs que son bien conocidos, pero no el auto-firmado. (ver más abajo) no lo he probado, pero ellas tienen un código de ejemplo en cómo lograr que aquí.

    Si una aplicación quiere confiar en el Certificado de Autoridad (CA)
    los certificados que no son parte del sistema, se debe especificar su
    propio 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();
    • Gracias! He probado a conectar a diferentes https sitios web mediante el código. El comportamiento predeterminado de la SSLSocketFactory es aceptar sólo los certicados firmado por el CAs. He recibido un sol.de seguridad.validador.ValidatorException cuando traté de conectar a un sitio web cuyo certificado auto-firmado. Gracias por la aclaración!
    • Veo, Así que si usted sabe que el servidor solo acepta HTTPS URI, usted puede utilizar con seguridad HttpURLConnection para hacer sus peticiones?

Dejar respuesta

Please enter your comment!
Please enter your name here