Mensagem de erro
SSL routines:ssl3_read_bytes:tlsv1 unrecognized name
Também aparece como
- error:0A000458:SSL routines::tlsv1 unrecognized name
- SSL alert number 112
O OpenSSL 3.x imprime “error:0A000458:SSL routines:ssl3_read_bytes:tlsv1 unrecognized name:…:SSL alert number 112”. Clientes Java informam o mesmo alerta como “javax.net.ssl.SSLHandshakeException: Received fatal alert: unrecognized_name”.
OpenSSL (client side) — TLS alert 112 (unrecognized_name) sent by a server that does not serve the requested SNI name
O que significa
O cliente enviou um nome de servidor (SNI) que o servidor não atende, e o servidor respondeu com o alerta TLS 112 (unrecognized_name) como alerta fatal. A RFC 6066 permite que os servidores enviem esse alerta como aviso ou como fatal; servidores rigorosos (e alguns appliances) tratam nomes desconhecidos como fatais, então o handshake termina antes que qualquer certificado seja apresentado.
Por que acontece
O servidor não tem configuração para esse nome
comumUm novo nome de host apontado para um servidor existente, um serviço renomeado ou um CNAME para uma CDN ou plataforma em que o domínio personalizado nunca foi adicionado.
O cliente envia um nome diferente do pretendido
comumClientes que se conectam por um alias interno ou pelo nome de um balanceador de carga enviam esse alias como SNI; o servidor só conhece o nome público.
Sem SNI ou com um endereço em vez de um nome
ocasionalAlguns clientes não enviam SNI ao se conectar por endereço IP; servidores configurados para exigir um nome conhecido os recusam.
Como corrigir
- 1.
Descobrir quais nomes o servidor aceita
Teste o handshake com cada nome candidato; os que funcionam estão configurados no servidor.
bash # Which names does the server accept? for n in example.com www.example.com api.example.com; do printf '%-20s ' "$n" echo | openssl s_client -connect 203.0.113.10:443 -servername "$n" -brief 2>&1 | grep -m1 -E 'Protocol version|error' || echo fail done - 2.
Configurar no servidor o nome que falta
Adicione o nome ao bloco server (ou à lista de domínios da CDN/plataforma) junto com um certificado que o cubra.
text # nginx: a server block (and certificate) for every name clients use server { listen 443 ssl; server_name api.example.com legacy-api.example.com; ssl_certificate /etc/nginx/tls/api.fullchain.pem; ssl_certificate_key /etc/nginx/tls/api.key; } - 3.
Fazer o cliente enviar o nome correto
Mantenha o nome de host real na URL e substitua apenas o endereço (curl --resolve, opções servername nas bibliotecas).
bash # Send the server's real name as SNI when connecting by address curl --resolve api.example.com:443:203.0.113.10 https://api.example.com/ openssl s_client -connect 203.0.113.10:443 -servername api.example.com </dev/null