Zum Inhalt springen
ecdsa.com
Node.js tls.checkServerIdentity()Node.js crypto

Fehlermeldung

Hostname/IP does not match certificate's altnames: Host: api.example.com. is not in the cert's altnames: DNS:www.example.com

Auch ausgegeben als

  • Hostname/IP does not match certificate's altnames: IP: 127.0.0.1 is not in the cert's list:
  • code: 'ERR_TLS_CERT_ALTNAME_INVALID'
  • ERR_TLS_CERT_ALTNAME_INVALID

Der Host und die Liste der altnames hängen vom jeweiligen Fehlerfall ab. Bei IP-Adressen lautet die Meldung „Hostname/IP does not match certificate's altnames: IP: <address> is not in the cert's list: <entries>“. npm zeigt sie als „npm error code ERR_TLS_CERT_ALTNAME_INVALID“.

Node.js tls.checkServerIdentity() — code ERR_TLS_CERT_ALTNAME_INVALID

Was der Fehler bedeutet

Die Zertifikatskette ist vertrauenswürdig, aber tls.checkServerIdentity() hat keinen Subject Alternative Name gefunden, der zu dem Host passt, mit dem sich Node.js verbunden hat. Die Meldung nennt beide Seiten: den Host, den du angefragt hast, und die Namen, die das Zertifikat tatsächlich enthält, sodass die Abweichung sofort zu sehen ist. Der Common Name wird ignoriert, wenn das Zertifikat eine SAN-Erweiterung hat.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Namen des Zertifikats auflisten

    Vergleiche subjectAltName mit dem Host, zu dem du dich verbindest.

    bash
    echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \
      | openssl x509 -noout -ext subjectAltName
  2. 2.

    Mit allen verwendeten Namen neu ausstellen

    Nimm alle DNS-Namen auf und, wenn sich Clients über die Adresse verbinden, auch IP-Einträge.

    bash
    openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \
      -addext "subjectAltName=DNS:api.example.com,DNS:www.example.com,IP:10.0.0.5"
  3. 3.

    servername setzen, wenn du dich über die Adresse verbindest

    Setze servername (und den Host-Header) auf den Namen des Zertifikats und verbinde dich mit der Adresse; die Prüfung verwendet dann den richtigen Namen, statt abgeschaltet zu werden.

    js
    // Connect to an address but verify the certificate's real name (also sent as SNI)
    import https from "node:https";
    
    https.get({ host: "10.0.0.5", port: 443, path: "/", servername: "api.example.com",
                headers: { host: "api.example.com" } }, (res) => res.resume());
  4. 4.

    Eng begrenzte Ausnahme mit checkServerIdentity

    Bei einem Legacy-Host, dessen Zertifikat sich noch nicht neu ausstellen lässt, ordne einen bekannten Alias dem Namen des Zertifikats zu und delegiere an tls.checkServerIdentity(). Gib niemals bedingungslos undefined zurück: Damit ist die Namensprüfung komplett abgeschaltet.

    js
    // Narrow exception for a host you cannot reissue: accept one extra name, keep all other checks
    import https from "node:https";
    import tls from "node:tls";
    
    const agent = new https.Agent({
      checkServerIdentity: (host, cert) =>
        tls.checkServerIdentity(host === "legacy-alias.internal" ? "api.example.com" : host, cert),
    });

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen