Fehlermeldung
npm error code UNABLE_TO_VERIFY_LEAF_SIGNATURE
Auch ausgegeben als
- 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 und neuer geben „npm error code UNABLE_TO_VERIFY_LEAF_SIGNATURE“ aus, npm 9 und älter „npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE“. Neuere Node.js-Versionen hängen „; if the root CA is installed locally, try running Node.js with --use-system-ca“ an die reason-Zeile an.
npm (Node.js) — registry request over HTTPS
Was der Fehler bedeutet
Die Registry (oder ein vorgeschalteter Proxy) hat nur das eigene Zertifikat gesendet, und Node.js konnte das Zertifikat nicht finden, das es ausgestellt hat. Ohne den Aussteller lässt sich die Signatur des Leaf-Zertifikats überhaupt nicht prüfen. Das ist ein Konfigurationsproblem des Servers: Im Handshake fehlt das Zwischenzertifikat, und Node.js behebt das nicht, indem es dieses Zertifikat herunterlädt.
Warum der Fehler auftritt
Eine private Registry, die nur mit dem Leaf-Zertifikat konfiguriert ist
häufigNexus, Artifactory, Verdaccio oder ein vorgeschalteter Reverse Proxy, eingerichtet mit cert.pem statt der vollständigen Kette.
Ein Proxy, der nur sein Leaf-Zertifikat präsentiert
gelegentlichManche Proxys mit TLS-Inspektion senden ein Zertifikat, das von einem Zwischenzertifikat ausgestellt wurde, ohne dieses Zwischenzertifikat mitzusenden.
Ein Leaf-Zertifikat einer unbekannten privaten CA
gelegentlichIst Node.js nichts oberhalb des Leaf-Zertifikats bekannt, erscheint derselbe Code; der Fehler verschwindet, wenn du der CA (und ihrem Zwischenzertifikat) vertraust.
So behebst du den Fehler
- 1.
Zertifikate im Handshake zählen
Erscheint nur das Zertifikat auf Tiefe 0, mit einem Zwischenzertifikat als Aussteller, ist bestätigt, dass das Zwischenzertifikat fehlt.
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.
Vollständige Kette auf der Registry ausliefern
Konfiguriere den TLS-Terminator vor der Registry mit dem Leaf-Zertifikat und den Zwischenzertifikaten. Das behebt das Problem für npm, yarn, pnpm, Docker und jeden anderen Client auf einmal.
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.
Übergangslösung: dem Zwischenzertifikat auf dem Client vertrauen
Setzt du cafile auf eine Datei mit dem Zwischenzertifikat und seinem Root-Zertifikat, kann npm das Leaf-Zertifikat prüfen, bis der Server korrigiert ist; cafile ersetzt die Standard-Root-Zertifikate für npm, nimm also auch öffentliche Root-Zertifikate auf, wenn dasselbe npm auch registry.npmjs.org nutzt.
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