Message d’erreur
SSL routines:ssl3_read_bytes:tlsv1 unrecognized name
Également affiché sous la forme
- error:0A000458:SSL routines::tlsv1 unrecognized name
- SSL alert number 112
OpenSSL 3.x affiche « error:0A000458:SSL routines:ssl3_read_bytes:tlsv1 unrecognized name:…:SSL alert number 112 ». Les clients Java signalent la même alerte sous la forme « 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
Ce que cela signifie
Le client a envoyé un nom de serveur (SNI) que le serveur ne sert pas, et le serveur a répondu par l’alerte TLS 112 (unrecognized_name) en tant qu’alerte fatale. La RFC 6066 permet aux serveurs d’envoyer cette alerte comme avertissement ou comme alerte fatale ; les serveurs stricts (et certains équipements) traitent les noms inconnus comme fatals, si bien que le handshake se termine avant qu’aucun certificat ne soit présenté.
Pourquoi cela se produit
Le serveur n’a aucune configuration pour ce nom
fréquenteUn nouveau nom d’hôte pointé vers un serveur existant, un service renommé, ou un CNAME vers un CDN ou une plateforme où le domaine personnalisé n’a jamais été ajouté.
Le client envoie un autre nom que celui prévu
fréquenteLes clients qui se connectent via un alias interne ou un nom de répartiteur de charge envoient cet alias comme SNI ; le serveur ne connaît que le nom public.
Pas de SNI, ou une adresse au lieu d’un nom
occasionnelleCertains clients n’envoient pas de SNI lorsqu’ils se connectent par adresse IP ; les serveurs configurés pour exiger un nom connu les refusent.
Comment corriger l’erreur
- 1.
Trouver les noms acceptés par le serveur
Tentez le handshake avec chaque nom candidat ; ceux qui réussissent sont configurés sur le serveur.
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.
Configurer le nom manquant sur le serveur
Ajoutez le nom au bloc server (ou à la liste de domaines du CDN ou de la plateforme), avec un certificat qui le couvre.
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.
Faire envoyer le bon nom par le client
Conservez le vrai nom d’hôte dans l’URL et ne remplacez que l’adresse (curl --resolve, options servername des bibliothèques).
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