Saltar al contenido

obteniendo javax.net.ssl.SSLException: Alerta fatal recibida: protocol_version al extraer datos usando Jsoup

Nuestro grupo especializado pasados algunos días de investigación y de juntar de datos, dimos con la solución, nuestro deseo es que resulte útil para ti en tu proyecto.

Solución:

Desea utilizar Java 8 aquí, ya que es compatible con TLSv1.2 de forma predeterminada con conjuntos de cifrado adicionales necesarios.

¿Por qué no Java 7?

Probé en mi caja con Java 7 (1.7.0_45) y obtuve el mismo error.

Activé los mensajes de depuración y forcé TLSv1.2.

System.setProperty("javax.net.debug", "all");
System.setProperty("https.protocols", "TLSv1.2");

Luego me encontré con este nuevo error:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

Finalmente, fui al analizador SSL de Comodoca y vi algo interesante. Según el analizador de SSL, el sitio al que se dirige solo ha habilitado los siguientes conjuntos de cifrado:

Cipher Suites Enabled
Name  (ID)                                       Key Size (in bits)
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256  (0xC02F)  128   ECDH 256-bit (P-256) 
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384  (0xC030)  256   ECDH 256-bit (P-256) 
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256  (0x9E)      128   DH 2048-bit  
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384  (0x9F)      256   DH 2048-bit

(ver detalles completos)

Por mi parte, no tengo ninguna de las suites anteriores. Comprueba si los tienes:

SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, null, new java.security.SecureRandom());

String[] scs = sc.getSocketFactory().getSupportedCipherSuites();
Arrays.sort(scs);

for(String s : scs) 
   System.out.println(s);

Consulte SSLSocketFactoryEx para habilitar los conjuntos de cifrado necesarios.

¿Por qué Java 8?

Por otro lado, logré ejecutar el código al pasar de Java 7 a Java 8 (1.8.0_20), que admite TLS v1.2 de forma predeterminada y proporciona los conjuntos de cifrado necesarios.

Aquí hay una lista recortada de suites de cifrado admitidas (71 suites en total) para Java 8 (1.8.0_20) en Windows 7.

TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
...
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

Retazo

try 
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[]  new X509TrustManager() 
        public java.security.cert.X509Certificate[] getAcceptedIssuers() 
            return null;
        

        public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) 
        

        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) 
        
     ;

    // Install the all-trusting trust manager
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    // Fetch url
    String url = "https://www.sos.nh.gov/corporate/soskb/SearchResults.asp?FormName=CorpNameSearch&Words=All&SearchStr=facebook&SearchType=Search";

    Connection.Response response = Jsoup //
            .connect(url) //
            .timeout(60000) //
            .method(Connection.Method.GET) //
            .userAgent("Mozilla/5.0 (Windows NT 10.0; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0") //
            .execute();

    Document document = response.parse();
    System.out.println(document);
 catch (Exception e) 
    e.printStackTrace();

Pensamiento final:

Cuando se trata de seguridad, SIEMPRE utilice la última versión actualizada.

(Del comentario para el cierre, ampliado un poco para futuros buscadores)

Por experimento, ese sitio requiere la versión del protocolo TLSv1.2 y aunque Java7 JSSE implementa esto, el lado del cliente por defecto deshabilita 1.2 y 1.1. Java8 los habilita por defecto; o en Java7 ya que Jsoup usa HttpsURLConnection puede cambiar las versiones habilitadas con propiedad del sistema https.protocols. Debes incluir al menos TLSv1.2 y para una mayor flexibilidad debe usar todos los protocolos actualmente aceptables https.protocols=TLSv1,TLSv1.1,TLSv1.2.

Además, usando esa confianza total TrustManager significa que prácticamente cualquier villano con acceso a su red puede falsificar este sitio y exponer cualquier información confidencial que le envíe. Es mejor configurar su almacén de confianza local para que acepte los certificados y, por lo tanto, los servidores que necesita, pero no los falsos.

valoraciones y reseñas

Al final de la web puedes encontrar las crónicas de otros usuarios, tú asimismo puedes mostrar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *