Pular para o conteúdo
ecdsa.com
OpenSSL (client side)CLI do OpenSSL

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

Como corrigir

  1. 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. 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. 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

Erros relacionados

Ver toda a base de erros de assinatura