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)
Respuestas:
Simplemente puede agregar la siguiente propiedad
-Dhttps.protocols=TLSv1.1,TLSv1.2
que configura la JVM para especificar qué versión del protocolo TLS debe usarse durante las conexiones https.fuente
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.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
fuente
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 laAdvanced
pestaña y desplácese hacia abajo hasta laAdvanced Security Settings
sección y marque las casillas de verificaciónUse TLS 1.1
yUse TLS 1.2
.fuente
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).javac ProtocolTest.java && java ProtocolTest
en una terminal. Vea lo que aparece en Protocolos habilitados .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");
fuente
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 editandobin/catalina.sh
o creandobin/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.
fuente
Si está atascado con Java 7, puede agregar
-Djdk.tls.client.protocols=TLSv1.1,TLSv1.2
a los argumentos de la JVM.Tenga en cuenta que esto tiene varias advertencias:
JAVA_OPTS
), en cuyo caso dependerá del soporte de envvar en sus aplicaciones Java.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.
fuente