Saltar al contenido

¿Cómo resolver el error javax.net.ssl.SSLHandshakeException?

Estate atento ya que en este escrito encontrarás el arreglo que buscas.

Solución:

Primero, debe obtener el certificado público del servidor al que intenta conectarse. Eso se puede hacer de varias maneras, como comunicarse con el administrador del servidor y solicitarlo, usar OpenSSL para descargarlo o, dado que parece ser un servidor HTTP, conectarse con cualquier navegador, ver la información de seguridad de la página. y guardar una copia del certificado. (Google debería poder decirle exactamente qué hacer para su navegador específico).

Ahora que tiene el certificado guardado en un archivo, debe agregarlo al almacén de confianza de su JVM. En $JAVA_HOME/jre/lib/security/ para JRE o $JAVA_HOME/lib/security para JDK, hay un archivo llamado cacerts, que viene con Java y contiene los certificados públicos de las reconocidas Autoridades Certificadoras. Para importar el nuevo certificado, ejecute keytool como un usuario que tiene permiso para escribir en cacerts:

keytool -import -file  -alias  -keystore 

Lo más probable es que te pida una contraseña. La contraseña predeterminada que se envía con Java es changeit. Casi nadie lo cambia. Después de completar estos pasos relativamente simples, se comunicará de forma segura y con la seguridad de que está hablando con el servidor correcto y solo con el servidor correcto (siempre y cuando no pierdan su privacidad). key).

Ahora resolví este problema de esta manera,

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.OutputStream; 

// Create a trust manager that does not validate certificate chains like the default 

TrustManager[] trustAllCerts = new TrustManager[]
        new X509TrustManager() 

            public java.security.cert.X509Certificate[] getAcceptedIssuers()
            
                return null;
            
            public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
            
                //No need to implement.
            
            public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
            
                //No need to implement.
            
        
;

// Install the all-trusting trust manager
try 

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
 
catch (Exception e) 

    System.out.println(e);

Por supuesto, esta solución solo debe usarse en escenarios, donde no es posible instalar los certificados requeridos usando keytool por ejemplo, pruebas locales con certifcados temporales.

Cada vez que intentamos conectarnos a la URL,

si el servidor en el otro sitio se ejecuta en el protocolo https y exige que nos comuniquemos a través de la información proporcionada en el certificado, entonces tenemos la siguiente opción:

1) solicite el certificado (descargue el certificado), importe este certificado en trustore. Los usos predeterminados de Trustore Java se pueden encontrar en Javajdk1.6.0_29jrelibsecuritycacerts, luego, si volvemos a intentar conectarnos a la URL, se aceptará la conexión.

2) En casos comerciales normales, es posible que nos conectemos a URL internas en organizaciones y sabemos que son correctas. En tales casos, confía en que es la URL correcta. En los casos anteriores, se puede usar un código que no obligará a almacenar el certificado para conectarse a una URL en particular.

para el punto no 2 tenemos que seguir los siguientes pasos:

1) escriba el método a continuación que establece HostnameVerifier para HttpsURLConnection que devuelve true para todos los casos, lo que significa que estamos confiando en TrustStore.

  // trusting all certificate 
 public void doTrustToCertificates() throws Exception 
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        TrustManager[] trustAllCerts = new TrustManager[]
                new X509TrustManager() 
                    public X509Certificate[] getAcceptedIssuers() 
                        return null;
                    

                    public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException 
                        return;
                    

                    public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException 
                        return;
                    
                
        ;

        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HostnameVerifier hv = new HostnameVerifier() 
            public boolean verify(String urlHostName, SSLSession session) 
                if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) 
                    System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");
                
                return true;
            
        ;
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    

2) escriba el método a continuación, que llama a doTrustToCertificates antes de intentar conectarse a la URL

    // connecting to URL
    public void connectToUrl()
     doTrustToCertificates();//  
     URL url = new URL("https://www.example.com");
     HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
     System.out.println("ResponseCode ="+conn.getResponseCode());
   

Esta llamada devolverá el código de respuesta = 200, lo que significa que la conexión se ha realizado correctamente.

Para obtener más detalles y un ejemplo de muestra, puede consultar la URL.

Sección de Reseñas y Valoraciones

Si para ti ha sido de ayuda este post, agradeceríamos que lo compartas con el resto seniors de esta forma nos ayudas a extender nuestra información.

¡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 *