Aller au contenu
ecdsa.com
Node.js tls.checkServerIdentity()Node.js crypto

Message d’erreur

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

Également affiché sous la forme

  • 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

L’hôte et la liste altnames sont renseignés à chaque échec. Pour les adresses IP, le libellé est « Hostname/IP does not match certificate's altnames: IP: <address> is not in the cert's list: <entries> ». npm l’affiche sous la forme « npm error code ERR_TLS_CERT_ALTNAME_INVALID ».

Node.js tls.checkServerIdentity() — code ERR_TLS_CERT_ALTNAME_INVALID

Ce que cela signifie

La chaîne de certificats est approuvée, mais tls.checkServerIdentity() n’a trouvé aucun nom alternatif du sujet (Subject Alternative Name) correspondant à l’hôte auquel Node.js s’est connecté. Le message indique les deux côtés : l’hôte que vous avez demandé et les noms que le certificat contient réellement, si bien que la non-correspondance se voit au premier coup d’œil. Le nom commun (Common Name) est ignoré lorsque le certificat possède une extension SAN.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Lister les noms du certificat

    Comparez subjectAltName avec l’hôte auquel vous vous connectez.

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

    Réémettre avec tous les noms utilisés

    Ajoutez tous les noms DNS et, lorsque des clients se connectent par adresse, les entrées IP.

    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.

    Définir servername lors d’une connexion par adresse

    Mettez le nom du certificat dans servername (et dans l’en-tête Host) et connectez-vous à l’adresse ; la vérification utilise alors le bon nom au lieu d’être désactivée.

    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.

    Exception ciblée avec checkServerIdentity

    Pour un hôte hérité dont le certificat ne peut pas encore être réémis, associez un seul alias connu au nom du certificat et déléguez à tls.checkServerIdentity(). Ne renvoyez jamais undefined sans condition : cela désactive complètement le contrôle du nom.

    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),
    });

Erreurs associées

Parcourir toute la base de données des erreurs de signature