Fehlermeldung
SSL routines:ssl3_read_bytes:tlsv1 unrecognized name
Auch ausgegeben als
- error:0A000458:SSL routines::tlsv1 unrecognized name
- SSL alert number 112
OpenSSL 3.x gibt „error:0A000458:SSL routines:ssl3_read_bytes:tlsv1 unrecognized name:…:SSL alert number 112“ aus. Java-Clients melden denselben Alert als „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
Was der Fehler bedeutet
Der Client hat einen Servernamen (SNI) gesendet, den der Server nicht bedient, und der Server hat mit dem fatalen TLS-Alert 112 (unrecognized_name) geantwortet. RFC 6066 erlaubt Servern, diesen Alert als Warnung oder als fatalen Alert zu senden; strenge Server (und manche Appliances) behandeln unbekannte Namen als fatal, deshalb endet der Handshake, bevor überhaupt ein Zertifikat gezeigt wird.
Warum der Fehler auftritt
Der Server hat keine Konfiguration für diesen Namen
häufigEin neuer Hostname, der auf einen bestehenden Server zeigt, ein umbenannter Dienst oder ein CNAME auf ein CDN oder eine Plattform, bei der die eigene Domain nie hinzugefügt wurde.
Der Client sendet einen anderen Namen als beabsichtigt
häufigClients, die sich über einen internen Alias oder den Namen eines Load Balancers verbinden, senden diesen Alias als SNI; der Server kennt nur den öffentlichen Namen.
Kein SNI oder eine Adresse statt eines Namens
gelegentlichManche Clients senden kein SNI, wenn sie sich über eine IP-Adresse verbinden; Server, die so konfiguriert sind, dass sie einen bekannten Namen verlangen, weisen diese Clients ab.
So behebst du den Fehler
- 1.
Namen finden, die der Server akzeptiert
Versuche den Handshake mit jedem infrage kommenden Namen; die Namen, bei denen er gelingt, sind auf dem Server konfiguriert.
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.
Fehlenden Namen auf dem Server konfigurieren
Füge den Namen dem Server-Block (oder der Domain-Liste des CDN oder der Plattform) hinzu, zusammen mit einem Zertifikat, das ihn abdeckt.
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.
Client den richtigen Namen senden lassen
Behalte den echten Hostnamen in der URL und überschreibe nur die Adresse (curl --resolve, die Option servername in Bibliotheken).
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