Mensagem de erro
SSL routines:ssl_choose_client_version:unsupported protocol
Também aparece como
- error:0A000102:SSL routines::unsupported protocol
A CLI do openssl imprime “<thread>:error:0A000102:SSL routines:ssl_choose_client_version:unsupported protocol:<source>”; o curl, o Node.js e outros aplicativos mostram “error:0A000102:SSL routines::unsupported protocol”. O OpenSSL 1.1.1 usava o código 1425F102.
OpenSSL (client side) — SSL_R_UNSUPPORTED_PROTOCOL: the server chose a version the client does not allow
O que significa
O cliente ofereceu TLS 1.2 e 1.3, mas o ServerHello do servidor escolheu uma versão mais antiga (normalmente TLS 1.0), que o OpenSSL do cliente não tem permissão para usar. O cliente aborta em ssl_choose_client_version. Pilhas TLS antigas ignoram a faixa oferecida pelo cliente e simplesmente respondem com a própria versão; pilhas modernas, em vez disso, recusariam com um alerta protocol_version.
Por que acontece
O servidor só fala TLS 1.0 ou 1.1
comumServidores sem manutenção, appliances antigos e dispositivos embarcados.
O OpenSSL do cliente proíbe versões antigas
comumDistribuições atuais definem o TLS 1.2 como mínimo (nível de segurança 2), então um servidor que funcionava a partir de uma máquina antiga falha a partir de uma nova.
Como corrigir
- 1.
Confirmar a versão do servidor
Forçar o TLS 1.0 com nível de segurança 0, só neste comando de diagnóstico, mostra se o servidor fala apenas a versão antiga.
bash # Allowed only for this diagnostic command: which version does the server pick? echo | openssl s_client -connect legacy.example.com:443 -servername legacy.example.com \ -tls1 -cipher 'DEFAULT:@SECLEVEL=0' -brief 2>&1 | grep -E 'Protocol version|error' - 2.
Ativar TLS 1.2 e 1.3 no servidor
Atualizar o servidor (ou colocar na frente dele um terminador TLS moderno) é a única correção duradoura.
text # Server side ssl_protocols TLSv1.2 TLSv1.3; # nginx SSLProtocol -all +TLSv1.2 +TLSv1.3 # Apache httpd