Message d’erreur
npm error code UNABLE_TO_VERIFY_LEAF_SIGNATURE
Également affiché sous la forme
- npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE
- npm error request to https://registry.example.com/lodash failed, reason: unable to verify the first certificate
npm 10 et les versions ultérieures affichent « npm error code UNABLE_TO_VERIFY_LEAF_SIGNATURE », npm 9 et les versions antérieures « npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE ». Les versions récentes de Node.js ajoutent « ; if the root CA is installed locally, try running Node.js with --use-system-ca » à la ligne de raison.
npm (Node.js) — registry request over HTTPS
Ce que cela signifie
Le registre (ou un proxy placé devant lui) n’a envoyé que son propre certificat, et Node.js n’a pas trouvé le certificat qui l’a émis. Sans l’émetteur, la signature du certificat feuille ne peut tout simplement pas être vérifiée. Il s’agit d’un problème de configuration du serveur : le certificat intermédiaire manque dans le handshake, et Node.js ne compense pas ce manque en le téléchargeant.
Pourquoi cela se produit
Un registre privé configuré avec le seul certificat feuille
fréquenteNexus, Artifactory, Verdaccio ou un proxy inverse placé devant eux, installé avec cert.pem au lieu de la chaîne complète.
Un proxy qui ne présente que son certificat feuille
occasionnelleCertains proxys d’inspection TLS envoient un certificat émis par une AC intermédiaire sans inclure le certificat de cette AC intermédiaire.
Un certificat feuille émis par une AC privée inconnue
occasionnelleSi Node.js ne connaît rien au-dessus du certificat feuille, le même code apparaît ; faire confiance à l’AC (et à son AC intermédiaire) règle le problème.
Comment corriger l’erreur
- 1.
Compter les certificats dans le handshake
Seule la présence d’un unique certificat (profondeur 0) dont l’émetteur est une AC intermédiaire confirme que le certificat intermédiaire manque.
bash openssl s_client -connect registry.example.com:443 -servername registry.example.com -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:' - 2.
Servir la chaîne complète sur le registre
Configurez le composant qui assure la terminaison TLS devant le registre avec le certificat feuille et les certificats intermédiaires. Cela corrige d’un coup npm, yarn, pnpm, Docker et tous les autres clients.
text # Registry behind nginx: serve leaf + intermediate(s) ssl_certificate /etc/nginx/tls/registry.example.com.fullchain.pem; ssl_certificate_key /etc/nginx/tls/registry.example.com.key; - 3.
Contournement : faire confiance au certificat intermédiaire sur le client
Un cafile contenant le certificat intermédiaire et sa racine permet à npm de vérifier le certificat feuille en attendant la correction du serveur ; cafile remplace les racines par défaut de npm : ajoutez donc aussi les racines publiques si ce même npm utilise également registry.npmjs.org.
bash # Until the registry is fixed: trust the intermediate (plus its root) on the client cat issuing-ca.pem corp-root-ca.pem > /etc/ssl/private-ca/registry-ca.pem npm config set cafile /etc/ssl/private-ca/registry-ca.pem