Habilite TLS 1.1 y 1.2 para clientes en Java 7

50

Java 7 deshabilita TLS 1.1 y 1.2 para clientes. De Java Cryptography Architecture Documentación de proveedores de Oracle :

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 del cliente. Algunos servidores no implementan la compatibilidad directa correctamente y se niegan a hablar con los clientes TLS 1.1 o TLS 1.2. Para la interoperabilidad, SunJSSE no habilita TLS 1.1 o TLS 1.2 de forma predeterminada para las conexiones del cliente.

Estoy interesado en habilitar los protocolos en una configuración de todo el sistema (quizás a través de un archivo de configuración) y no en una solución por aplicación Java.

¿Cómo habilito administrativamente TLS 1.1 y 1.2 en todo el sistema ?

Nota : desde POODLE, me gustaría deshabilitar administrativamente todo el sistema SSLv3. (Los problemas con SSLv3 son anteriores a POODLE por al menos 15 años, pero Java / Oracle / Developers no respetaron las mejores prácticas básicas, por lo que los usuarios como usted y yo nos quedamos con la limpieza del desastre).


Aquí está la versión de Java:

$ /Library/Java/JavaVirtualMachines/jdk1.7.0_07.jdk/Contents/Home/bin/java -version
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)
jww
fuente
Lo único que funcionó para mí fue configurar el SSLContext predeterminado como se describe aquí: stackoverflow.com/questions/39157422/…
shmert

Respuestas:

31

Simplemente puede agregar la siguiente propiedad -Dhttps.protocols=TLSv1.1,TLSv1.2que configura la JVM para especificar qué versión del protocolo TLS debe usarse durante las conexiones https.

Tomasz Rebizant
fuente
66
Por favor explique más de lo que esto hace. De lo contrario, esto es vago y potencialmente dañino en las manos equivocadas.
studiohack
1
@Thomasz - Estoy de acuerdo con los demás aquí ... ¿Cómo lo hago administrativamente en todo el sistema? ¿Se agrega al archivo de configuración de una máquina? Si es así, ¿cuál es el archivo y dónde lo agrego?
jww
3
quizás este enlace ayude: blogs.oracle.com/java-platform-group/entry/… puede agregar la propiedad -Dhttps.protocols como parámetro en el ejemplo de línea de comando: java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2 o en algún lugar de los archivos de configuración de la aplicación (servidor). Puede verificar si funciona agregando parámetros adicionales: -Djavax.net.debug = todo después de eso, cuando la aplicación negocie la conexión https, imprimirá toda la información de negociación, incluida la versión del protocolo que se ha utilizado
Tomasz Rebizant
Este parámetro (https.protocols) está configurando la máquina virtual de Java qué versión de protocolo se debe usar durante la conexión https.
Tomasz Rebizant
3
@TomaszRebizant, sí, tienes razón. Por ejemplo, agregar export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"setenv.sh de Tomcat habilita TLSv1 y TLSv2 para todas las conexiones SSL realizadas desde aplicaciones en el servidor de aplicaciones.
Zaki
14

Puede intentar agregar algo como lo siguiente a su script de inicio, suponiendo Java 1.7:

JAVACMD="$JAVACMD -Ddeployment.security.SSLv2Hello=false -Ddeployment.security.SSLv3=false -Ddeployment.security.TLSv1=false -D\ deployment.security.TLSv1.1=true -Ddeployment.security.TLSv1.2=true"

Algunas otras sugerencias: https://blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls

cnst
fuente
donde encontró esta documentación de propiedades, no veo ningún lugar que mencionen en los documentos de JAVA7 para "-D implementación.seguridad. {ProtocolName} = True / False;"
código de ejecución
@runcode, no estoy seguro, pero se menciona en el blog de oracle.com al que se hace referencia anteriormente
cnst
1
@cnst: el problema aquí es que necesito contactar a cada desarrollador de cada pieza de software Java y decirles que hagan esto. De ahí la razón por la que quiero hacerlo administrativamente una vez en mi máquina.
jww
No funciono para mi.
Sridhar Sarnobat
9

Para Java 7 en Mac OS X, vaya a System Preferences > Java, y el Panel de control de Java se abre en una ventana separada. Luego, vaya a la Advancedpestaña y desplácese hacia abajo hasta la Advanced Security Settingssección y marque las casillas de verificación Use TLS 1.1y Use TLS 1.2.

ingrese la descripción de la imagen aquí

Spiff
fuente
Gracias Spiff Ya estoy configurado para TLS 1.0 y superior, como has mostrado. Sin embargo, cuando creo un SSLSocket(y supongo que esto le sucede a otros programas Java), TLS 1.0 está habilitado (y TLS 1.1 y 1.2 están disponibles).
jww
3
También puede probar esto en su sistema (si está interesado). Descargue ProtocolTest.java de este informe de error y ejecútelo. Para compilar y ejecutar, ejecutar javac ProtocolTest.java && java ProtocolTesten una terminal. Vea lo que aparece en Protocolos habilitados .
jww
2
Esto solo funciona para clientes WebStart y Applets. No afecta a los servidores de aplicaciones iniciados con el ejecutable java.
Eckes
8

Recientemente investigué esto y quiero agregar: esto no funcionará para JDK, las propiedades de implementación solo relevantes para Applets y otras cosas que se ejecutan en el JRE.

para aplicaciones JDK (un servidor que necesita conectarse a LDAP, por ejemplo), el servidor es un cliente pero el despliegue.seguridad. no funcionaría.

no hay forma de cambiarlo a menos que escriba algún código como SSLContext.getInstance ("TLSv1.2");

shlomicthailand
fuente
4

Parece que la configuración de settings.security. * Funciona para los Applets de Java y los programas Java Web Start que se ejecutan en un escritorio. Como otros mencionan aquí, puede editar deploy.properties para especificar eso.

Aquí hay un artículo que muestra cómo usar una política de grupo para implementar el mismo archivo deploy.properties para todos los usuarios: http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- java-7-update-10-via-gpo.html

Desafortunadamente, no hay forma de activar esto para todos los programas de Java en una computadora que llame directamente a java.exe o javaw.exe. Debe encontrar cada programa que use Java, encontrar el archivo de configuración donde especifique los parámetros para pasar a Java y cambiarlo.

Para Tomcat tuvimos que pasar esto para que las conexiones de Tomcat a otros servidores utilizan TLS 1.1 +: -Dhttps.protocols=TLSv1.1,TLSv1.2. En Linux, esto se puede hacer editando bin/catalina.sho creando bin/setenv.sh.

No sé qué se necesita para que Tomcat use solo TLS 1.2 en el lado del servidor. Nos enfrentamos con Apache HTTP.

sjbotha
fuente
1

Si está atascado con Java 7, puede agregar -Djdk.tls.client.protocols=TLSv1.1,TLSv1.2a los argumentos de la JVM.

Tenga en cuenta que esto tiene varias advertencias:

A pesar de estas deficiencias, creo que esto podría ser útil, especialmente cuando el protocolo en el que uno está interesado usa TLS pero no es HTTPS, por ejemplo, LDAPS.

[ACTUALIZACIÓN] En mi empresa, que ejecuta su grupo de servidores en Ubuntu, nos hemos dado cuenta de que incluso la actualización 121 de OpenJDK 7 no fue suficiente para implementar esto correctamente. Hemos actualizado todos los servidores para actualizar 181 antes de que funcionara.

AbVog
fuente