Saltar al contenido

Spring RestTemplate: falla de protocolo de enlace SSL

Hemos estado recabando en todo el mundo online para así tenerte la respuesta a tu duda, en caso de alguna inquietud puedes dejar tu comentario y te responderemos con gusto.

Solución:

Desde javax.net.debug log Puedo ver que está utilizando Java 7 y el cliente se resuelve en TLSv1. Desde openssl salida que su servidor no es compatible con TLSv1.

Versión TLS. 1.1 y 1.2 están deshabilitados en Java 7 de forma predeterminada.

Aunque SunJSSE en la versión Java SE 7 es compatible con TLS 1.1 y TLS 1.2, ninguna de las versiones está habilitada de forma predeterminada para las conexiones de clientes. Algunos servidores no implementan correctamente la compatibilidad con versiones anteriores y se niegan a hablar con clientes TLS 1.1 o TLS 1.2. Para la interoperabilidad, SunJSSE no habilita TLS 1.1 o TLS 1.2 de manera predeterminada para las conexiones de clientes.

Habilite TLSv1.1 y TLSv1.2 ya sea por:

  1. Argumento JVM:

    -Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1
    
  2. O establezca la misma propiedad desde el código Java:

    System.setProperty("https.protocols", "TLSv1.2,TLSv1.1,TLSv1");
    
  3. O instale los archivos de política JCE Unlimited Strength para Java 7. No estoy 100 % seguro de si este único paso resolvería el problema, aunque siempre vale la pena instalar JCE mientras permite que JVM use versiones más fuertes de los algoritmos existentes.

ACTUALIZACIÓN 29/Sep/2016:

El orden de los protocolos cambió de mejor a peor (TLS ver. 1.2 a 1) en las opciones 1 y 2.

Si está utilizando Java 7, debe indicarle explícitamente a Java que utilice el protocolo TLSv1.2. Aquí hay un ejemplo usando la configuración Spring XML.

***In any Spring bean (i.e. a controller)***

import org.apache.http.client.HttpClient;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.HttpClients;
import javax.net.ssl.SSLContext;

@Bean(name="client")
public HttpClient make() throws NoSuchAlgorithmException, KeyManagementException 
    SSLContext sslContext = SSLContexts.custom().build();
    SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
            new String[]"TLSv1.2", "TLSv1.1", null, SSLConnectionSocketFactory.getDefaultHostnameVerifier());
    return HttpClients.custom()
            .setSSLSocketFactory(sslConnectionSocketFactory)
            .build();


***In XML configuration files***


    


    

Podrías hacer lo mismo sin XML con algo como esto:

RestTemplate restTemplate;

public HttpClient getHttpClient() throws NoSuchAlgorithmException, KeyManagementException 
    SSLContext sslContext = SSLContexts.custom().build();
    SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
            new String[]"TLSv1.2", "TLSv1.1", null, SSLConnectionSocketFactory.getDefaultHostnameVerifier());
    return HttpClients.custom()
            .setSSLSocketFactory(sslConnectionSocketFactory)
            .build();


public void setUp() throws Exception 
    restTemplate = new RestTemplate(
            new HttpComponentsClientHttpRequestFactory(
                    getHttpClient()));
    ...

Sección de Reseñas y Valoraciones

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