Mensagem de erro
The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]
Também aparece como
- javax.net.ssl.SSLHandshakeException: (protocol_version) The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]
A versão escolhida (TLS10, TLS11) e a lista entre colchetes dependem do servidor e dos protocolos ativados na JVM. O JDK 21 e as versões posteriores colocam “(protocol_version) ” antes do texto da exceção. Servidores que recusam a conexão em vez de negociar uma versão inferior produzem “Received fatal alert: protocol_version”.
Java (JSSE) — the server picked a TLS version the JVM does not allow
O que significa
A JVM ofereceu TLS 1.3 e 1.2, mas o servidor ignorou isso e respondeu com TLS 1.0 (TLS10) ou 1.1 (TLS11), que a JVM não aceita. O Java aborta o handshake do próprio lado. O servidor é antigo demais para os clientes atuais; qualquer JDK, navegador ou curl atualizado reage da mesma forma.
Por que acontece
O servidor só implementa TLS 1.0/1.1
comumServidores legados, appliances e dispositivos embarcados cuja pilha TLS é anterior ao TLS 1.2 (ou está com ele desativado).
Um equipamento intermediário antigo que faz a terminação do TLS
ocasionalUm balanceador de carga ou proxy na frente de um servidor moderno faz a terminação do TLS com uma pilha desatualizada.
O JDK foi atualizado
ocasionalEm 2021, atualizações de segurança desativaram o TLS 1.0 e o 1.1 em todas as linhas do JDK ainda mantidas; o mesmo servidor funcionava com atualizações mais antigas.
Como corrigir
- 1.
Ativar TLS 1.2 ou posterior no servidor
Esta é a correção que ajuda todos os clientes. O TLS 1.0 e o 1.1 estão 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 o TLS 1.2
Se um handshake TLS 1.2 falha enquanto o TLS 1.0 funciona, o servidor precisa ser atualizado.
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 em uma única JVM isolada
Uma sobrescrita das propriedades de segurança, montada a partir do próprio valor do JDK, reativa as versões antigas só para essa JVM. As versões TLS 1.0/1.1 dependem de construções com SHA-1 e CBC que têm fraquezas conhecidas; por isso, restrinja o uso a uma rede confiável e remova a sobrescrita assim que o dispositivo for substituído.
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
Erros 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