Usando HttpURLConnection y HttpsURLConnection para conectarse a un https?

¿Cuáles son las diferencias si intento conectarme a un "https" usando HttpURLConnection y HttpsURLConnection ?

Pude conectar a "https" usando HttpURLConnection y HttpsURLConnection así que estoy confundido. Pensé que sólo puedo establecer una conexión a un "https" si he utilizado HttpsURLConnection?

A continuación algunas de mis preguntas:

  • Si pude abrir una conexión a un "https" usando HttpURLConnection, ¿mi conexión sigue en "https" o se convierte en "http"?
  • ¿Qué tal la validación de los certificados? Puesto que no hice ningún SSLSocketFactory y HostnameVerifier en mi HttpURLConnection mientras que conectaba con un "https", qué SSLSocketFactory y HostnameVerifier estoy usando?
  • ¿Significa que estoy confiando en todo sin importar si el certificado es de confianza o no?

  1. HTTPS que se utiliza.
  2. Comportamientos predeterminados
  3. No estoy seguro pero lee abajo.

Acabo de escribir algún código como una prueba (ver todo el camino a continuación). Lo que acaba de suceder es la llamada URL.openConnection () le devolverá una clase libcore.net.http.HttpsURLConnectionImpl .

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

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

HostnameVerifier = javax.net.ssl.DefaultHostnameVerifier

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

Sobre la base de esto parece que los comportamientos predeterminados se están utilizando. No sé si eso significa que si confías en todo, pero definitivamente estás estableciendo una conexión HTTPS.

La documentación sugiere que la conexión confía automáticamente en CAs que son bien conocidas pero que no se auto-firman. (Ver más abajo) No he probado esto, pero tienen código de ejemplo sobre cómo lograr que aquí .

Si una aplicación desea confiar en certificados de Autoridad de certificación (CA) que no forman parte del sistema, debe especificar su propio X509TrustManager a través de un conjunto SSLSocketFactory en 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(); 
  • HttpUrlConnection de Android: Publicar Multipart
  • Reutilizando HttpURLConnection
  • HttpURLConnection PUT a Google Cloud Storage dando error 403
  • Obtener java.net.SocketTimeoutException: La conexión se agotó en android
  • Establecer setChunkedStreamingMode en HttpURLConnection no puede entregar datos al servidor
  • HttpURLConnection no descomprimir Gzip
  • AndroidHttpClient versus HttpUrlConnection para API Nivel 9 y superior
  • Cómo desconectar una HttpUrlConnection en teléfonos HTC (Froyo y abajo)?
  • Java.io.IOException: El desafío de autenticación recibido es nulo en ICS 4.0.3
  • Error de NetworkOnMainThreadException en jellybean
  • Reutilizando HttpURLConnection para mantener la sesión viva
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.