Zum Inhalt springen
ecdsa.com
OpenSSL (client side)OpenSSL-CLI

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

So behebst du den Fehler

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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen