Mensagem de erro
javax.net.ssl.SSLHandshakeException: (protocol_version) Received fatal alert: protocol_version
Também aparece como
- javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
O JDK 21 e as versões posteriores incluem o nome do alerta entre parênteses. Se, em vez disso, o servidor escolher uma versão que a JVM recusa, o Java diz “The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]”.
Java (JSSE) — TLS alert 70 received from the server
O que significa
O servidor recusou as versões de TLS que a JVM ofereceu e respondeu com o alerta 70 (protocol_version). Os JDKs atuais oferecem apenas TLS 1.3 e 1.2 (o 1.0 e o 1.1 estão em jdk.tls.disabledAlgorithms), então um servidor limitado às versões antigas não tem nenhuma versão em comum com eles.
Por que acontece
O servidor só oferece suporte a TLS 1.0 ou 1.1
comumAppliances legados, servidores IIS ou Java antigos e dispositivos embarcados que nunca receberam TLS 1.2.
O cliente está fixado em versões que o servidor desativou
ocasionalScripts de inicialização antigos definem https.protocols ou jdk.tls.client.protocols como TLSv1 por causa de um sistema legado que nem existe mais; servidores modernos recusam isso.
Como corrigir
- 1.
Descobrir quais versões o servidor aceita
Teste cada versão com o openssl s_client; depois corrija o lado que estiver desatualizado.
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.
Remover a fixação de protocolos no cliente
Procure https.protocols ou jdk.tls.client.protocols nos scripts de inicialização e nas opções da JVM; permita TLSv1.3 e 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.
Ativar TLS 1.2 e 1.3 no servidor
A correção duradoura: todos os clientes ainda mantidos oferecem suporte a essas versões.
text # Server side: enable TLS 1.2 and 1.3 ssl_protocols TLSv1.2 TLSv1.3;