Mensaje de error
SSL routines:ssl3_read_bytes:tlsv1 unrecognized name
También se muestra como
- error:0A000458:SSL routines::tlsv1 unrecognized name
- SSL alert number 112
OpenSSL 3.x imprime «error:0A000458:SSL routines:ssl3_read_bytes:tlsv1 unrecognized name:…:SSL alert number 112». Los clientes Java notifican la misma 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
Qué significa
El cliente envió un nombre de servidor (SNI) que el servidor no sirve, y el servidor respondió con la alerta TLS 112 (unrecognized_name) como alerta fatal. El RFC 6066 permite a los servidores enviar esta alerta como advertencia o como fatal; los servidores estrictos (y algunos dispositivos dedicados) tratan los nombres desconocidos como fatales, así que el handshake termina antes de que se muestre ningún certificado.
Por qué ocurre
El servidor no tiene ninguna configuración para ese nombre
frecuenteUn nombre de host nuevo que apunta a un servidor existente, un servicio renombrado o un CNAME hacia una CDN o una plataforma donde nunca se añadió el dominio personalizado.
El cliente envía un nombre distinto del previsto
frecuenteLos clientes que se conectan a través de un alias interno o del nombre de un balanceador de carga envían ese alias como SNI; el servidor solo conoce el nombre público.
Sin SNI o con una dirección en lugar de un nombre
ocasionalAlgunos clientes no envían SNI cuando se conectan por dirección IP; los servidores configurados para exigir un nombre conocido los rechazan.
Cómo solucionarlo
- 1.
Averiguar qué nombres acepta el servidor
Prueba el handshake con cada nombre candidato; aquellos con los que se completa están configurados en el 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 en el servidor el nombre que falta
Añade el nombre al bloque server (o a la lista de dominios de la CDN o la plataforma) junto con un certificado que lo 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.
Hacer que el cliente envíe el nombre correcto
Mantén el nombre de host real en la URL y sustituye solo la dirección (curl --resolve, las opciones servername de las 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