Mensaje de error
javax.net.ssl.SSLHandshakeException: (protocol_version) Received fatal alert: protocol_version
También se muestra como
- javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
JDK 21 y las versiones posteriores incluyen el nombre de la alerta entre paréntesis. Si, en cambio, el servidor elige una versión que la JVM rechaza, Java dice «The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]».
Java (JSSE) — TLS alert 70 received from the server
Qué significa
El servidor rechazó las versiones de TLS que ofreció la JVM y respondió con la alerta 70 (protocol_version). Los JDK actuales solo ofrecen TLS 1.3 y 1.2 (1.0 y 1.1 están en jdk.tls.disabledAlgorithms), así que un servidor limitado a las versiones antiguas no tiene ninguna versión en común con ellos.
Por qué ocurre
El servidor solo admite TLS 1.0 o 1.1
frecuenteDispositivos dedicados heredados, servidores IIS o Java antiguos y dispositivos embebidos que nunca recibieron TLS 1.2.
El cliente fuerza versiones que el servidor desactivó
ocasionalAlgunos scripts de arranque antiguos establecen https.protocols o jdk.tls.client.protocols en TLSv1 por un sistema heredado que desapareció hace tiempo; los servidores modernos lo rechazan.
Cómo solucionarlo
- 1.
Averiguar qué versiones acepta el servidor
Prueba cada versión con openssl s_client y luego corrige el lado que esté desactualizado.
bash for v in tls1 tls1_1 tls1_2 tls1_3; do printf '%-7s ' "$v" echo | openssl s_client -connect legacy.example.com:443 -servername legacy.example.com -"$v" \ -cipher 'DEFAULT:@SECLEVEL=0' >/dev/null 2>&1 && echo accepted || echo refused done - 2.
Quitar los protocolos fijados en el cliente
Busca https.protocols o jdk.tls.client.protocols en los scripts de arranque y en las opciones de la JVM; permite TLSv1.3 y TLSv1.2.
bash # Do not pin old versions on the client; let JSSE offer 1.3 and 1.2 grep -rn 'https.protocols\|jdk.tls.client.protocols' /etc/default/app* "$JAVA_HOME/conf" 2>/dev/null java -Djdk.tls.client.protocols=TLSv1.3,TLSv1.2 -jar app.jar - 3.
Habilitar TLS 1.2 y 1.3 en el servidor
La solución duradera: todos los clientes que siguen recibiendo mantenimiento las admiten.
text # Server side: enable TLS 1.2 and 1.3 ssl_protocols TLSv1.2 TLSv1.3;