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
Le certificat ne contient pas ce nom
fréquenteUn certificat pour www.example.com ne couvre ni api.example.com ni le domaine nu ; les wildcards ne couvrent qu’un seul niveau de sous-domaine.
Connexion par IP, localhost ou un alias de conteneur
fréquenteDes URL comme https://127.0.0.1:8443 ou https://backend:443 dans docker-compose demandent des noms que le certificat ne contient pas ; les adresses IP nécessitent des entrées SAN de type IP.
Seul l’en-tête Host a été modifié, pas le nom TLS
occasionnelleDéfinir headers.host sur le bon nom tout en se connectant par IP ne change pas ce que Node.js vérifie ; c’est l’option servername (ou l’hôte de l’URL) qui détermine quel nom est contrôlé et envoyé comme SNI.
Le serveur a renvoyé son certificat par défaut
occasionnelleUn proxy inverse sans configuration pour ce nom répond avec le certificat d’un autre site.
Comment corriger l’erreur
- 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.
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.
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.
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
npm error code ERR_TLS_CERT_ALTNAME_INVALIDnpm (Node.js)x509: certificate is valid for example.com, not api.example.comGo crypto/x509curl: (60) SSL: no alternative certificate subject name matches target hostname…curl (OpenSSL backend)[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch,…Python ssl module (OpenSSL host check)