tls sslv3 sslv2hello property legacyalgorithms jdk example enable disabledalgorithms dhttps java jboss java-7 tls1.2

java - sslv3 - maven dhttps protocols



Cómo habilitar TLS 1.2 en Java 7 (9)

Agregue este parámetro a JAVA_OPTS o a la línea de comando en maven: -Dhttps.protocols=TLSv1.2

Estoy tratando de habilitar TLS 1.2 en mi aplicación web que usa JBoss 6.4 y Java 1.7. Tengo -Dhttp.protocols = TLSv1.2 en mi entorno de aplicación, pero no parece funcionar para mí.

¿Hay algo que pueda hacer para habilitar TLS 1.2?

Escribi un programa simple

context = SSLContext.getInstance("TLSv1.2"); context.init(null,null,null); SSLContext.setDefault(context); SSLSocketFactory factory = (SSLSocketFactory)context.getSocketFactory(); SSLSocket socket = (SSLSocket)factory.createSocket(); protocols = socket.getEnabledProtocols();

Después de ejecutar este programa dentro de la aplicación, el TLS 1.2 se habilita. No quiero ejecutar este programa, pero quiero habilitarlo directamente durante el inicio de la aplicación. ¿Hay alguna forma de hacerlo?


Agregue la siguiente opción para la aplicación java:

-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2


Hay muchas sugerencias, pero encontré dos de ellas más comunes. Primero intenté export JAVA_OPTS="-Dhttps.protocols=SSLv3,TLSv1,TLSv1.1,TLSv1.2" en la línea de comando antes del inicio del programa, pero no funcionó para mí.

Luego agregué el siguiente código en el constructor de la clase de inicio y funcionó para mí.

try { SSLContext ctx = SSLContext.getInstance("TLSv1.2"); ctx.init(null, null, null); SSLContext.setDefault(ctx); } catch (Exception e) { System.out.println(e.getMessage()); }

Francamente, no sé en detalle por qué ctx.init(null, null, null); pero todos (SSL / TLS) están funcionando bien para mí.

Hay una opción más: System.setProperty("https.protocols", "SSLv3,TLSv1,TLSv1.1,TLSv1.2"); . También irá en código pero no lo he probado.


Las respuestas indicadas son correctas, pero solo comparto un problema adicional que era aplicable a mi caso: además de usar setProtocol / withProtocol , es posible que tenga algunos frascos desagradables que no desaparecerán incluso si tienen los frascos correctos más un el viejo:

Eliminar

<dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency>

Conservar

<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.6</version> </dependency>

Java es compatible con versiones anteriores, pero la mayoría de las bibliotecas no lo son. Cada día que pasa, más me gustaría que las bibliotecas compartidas fueran prohibidas por esta falta de responsabilidad.

Informacion adicional

java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)


Para forzar la habilitación de TLSv1.2 en JRE7u_80, tuve que usar el siguiente fragmento de código antes de crear una conexión JDBC.

import java.security.NoSuchAlgorithmException; import java.security.Provider; import javax.net.ssl.SSLContextSpi; import sun.security.jca.GetInstance; import sun.security.jca.ProviderList; import sun.security.jca.Providers; public static void enableTLSv12ForMssqlJdbc() throws NoSuchAlgorithmException { ProviderList providerList = Providers.getProviderList(); GetInstance.Instance instance = GetInstance.getInstance("SSLContext", SSLContextSpi.class, "TLS"); for (Provider provider : providerList.providers()) { if (provider == instance.provider) { provider.put("Alg.Alias.SSLContext.TLS", "TLSv1.2"); } } }

Capaz de conectarse a Windows 10 con SQL Server 2017 y sistema operativo habilitado para TLSv1.2.


Probablemente debería buscar la configuración que controla la implementación de TLS de la plataforma subyacente a través de -Djdk.tls.client.protocols=TLSv1.2 .


Puede actualizar su versión de Java 7 a 1.7.0_131-b31

Para JRE 1.7.0_131-b31 en el sitio de Oracle:

TLSv1.2 y TLSv1.1 ahora están habilitados de forma predeterminada en los puntos finales del cliente TLS. Este es un comportamiento similar a lo que ya sucede en las versiones de JDK 8.


Resolví este problema usando

Service.setSslSecurityProtocol(SSLSecurityProtocol.TLSv1_2);


System.setProperty("https.protocols", "TLSv1.2"); Trabajó en mi caso. ¿Lo has comprobado dentro de la aplicación?