Mensaje de error
The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]
También se muestra como
- javax.net.ssl.SSLHandshakeException: (protocol_version) The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]
La versión elegida (TLS10, TLS11) y la lista entre corchetes dependen del servidor y de los protocolos que tenga activados la JVM. JDK 21 y las versiones posteriores anteponen «(protocol_version) » al texto de la excepción. Los servidores que rechazan la conexión en lugar de bajar de versión producen «Received fatal alert: protocol_version».
Java (JSSE) — the server picked a TLS version the JVM does not allow
Qué significa
La JVM ofreció TLS 1.3 y 1.2, pero el servidor lo ignoró y respondió con TLS 1.0 (TLS10) o 1.1 (TLS11), que la JVM no acepta. Java aborta el handshake por su cuenta. El servidor es demasiado antiguo para los clientes actuales: cualquier JDK, navegador o curl actualizado reacciona igual.
Por qué ocurre
El servidor solo implementa TLS 1.0/1.1
frecuenteServidores heredados, dispositivos dedicados y dispositivos embebidos cuya pila TLS es anterior a TLS 1.2 (o lo tiene desactivado).
Un dispositivo intermedio antiguo que termina TLS
ocasionalUn balanceador de carga o un proxy delante de un servidor moderno termina TLS con una pila desactualizada.
Se actualizó el JDK
ocasionalEn 2021, las actualizaciones de seguridad desactivaron TLS 1.0 y 1.1 en todas las ramas del JDK con mantenimiento; el mismo servidor funcionaba con actualizaciones anteriores.
Cómo solucionarlo
- 1.
Habilitar TLS 1.2 o posterior en el servidor
Es la solución que ayuda a todos los clientes. TLS 1.0 y 1.1 están formalmente obsoletos (RFC 8996).
text # Enable TLS 1.2 (and 1.3) on the server or appliance ssl_protocols TLSv1.2 TLSv1.3; # nginx SSLProtocol -all +TLSv1.2 +TLSv1.3 # Apache httpd - 2.
Confirmar que falta TLS 1.2
Si un handshake con TLS 1.2 falla y uno con TLS 1.0 funciona, hay que actualizar el servidor.
bash echo | openssl s_client -connect legacy.example.com:443 -servername legacy.example.com -tls1_2 -brief - 3.
Último recurso: permitir TLS 1.0/1.1 en una JVM aislada
Una sobrescritura de las propiedades de seguridad construida a partir del valor del propio JDK vuelve a activar las versiones antiguas solo para esa JVM. TLS 1.0/1.1 dependen de construcciones con SHA-1 y CBC que tienen debilidades conocidas, así que limita esto a una red de confianza y quítalo en cuanto se sustituya el dispositivo.
bash # Last resort for ONE JVM that must reach the legacy server: drop TLSv1/TLSv1.1 from # this JDK's own jdk.tls.disabledAlgorithms value and pass it as an override v=$(sed -n '/^jdk.tls.disabledAlgorithms=/,/[^\\]$/p' "$JAVA_HOME/conf/security/java.security" | sed 's/\\$//' | tr -d '\n') printf '%s\n' "$v" | sed -E 's/ TLSv1(\.1)?,//g' > legacy-tls.security java -Djava.security.properties=legacy-tls.security -jar legacy-client.jar
Errores relacionados
javax.net.ssl.SSLHandshakeException: (protocol_version) Received fatal alert: p…Java (JSSE)No appropriate protocol (protocol is disabled or cipher suites are inappropriat…Java (JSSE)curl: (35) TLS connect error: error:0A000102:SSL routines::unsupported protocolcurl (OpenSSL backend)tls: server selected unsupported protocol version 301Go crypto/tls client