Fehlermeldung
npm error code DEPTH_ZERO_SELF_SIGNED_CERT
Auch ausgegeben als
- npm ERR! code DEPTH_ZERO_SELF_SIGNED_CERT
npm 10 und neuer geben „npm error code DEPTH_ZERO_SELF_SIGNED_CERT“ aus, npm 9 und älter „npm ERR! code DEPTH_ZERO_SELF_SIGNED_CERT“. Die reason-Zeile lautet „self-signed certificate“, bei neueren Node.js-Versionen mit dem Hinweis auf --use-system-ca.
npm (Node.js) — registry request over HTTPS
Was der Fehler bedeutet
Die Registry, mit der sich npm verbunden hat, hat ein einzelnes selbstsigniertes Zertifikat präsentiert, dem Node.js nicht vertraut. Es gibt überhaupt keine CA-Kette, also bleiben nur zwei Wege: genau diesem Zertifikat bewusst zu vertrauen oder der Registry ein von einer CA ausgestelltes Zertifikat zu geben. Typisch für lokale oder selbst gehostete Registrys, die mit einem generierten Zertifikat gestartet wurden.
Warum der Fehler auftritt
Eine lokale oder selbst gehostete Registry mit generiertem Zertifikat
häufigVerdaccio, eine Testversion von Nexus oder Artifactory oder ein Registry-Container, der mit einem selbstsignierten Zertifikat gestartet wurde.
Eine Appliance oder ein Proxy mit Werkszertifikat
gelegentlichManche Caching-Proxys und Netzwerk-Appliances präsentieren ein selbstsigniertes Zertifikat, bis ein richtiges installiert ist.
Ein Kubernetes-Ingress antwortet mit seinem Standardzertifikat
gelegentlichIst der Host der Registry auf dem Ingress nicht konfiguriert, liefert der Ingress ein selbstsigniertes Standardzertifikat aus (bei ingress-nginx: „Kubernetes Ingress Controller Fake Certificate“).
So behebst du den Fehler
- 1.
Genau diesem Zertifikat vertrauen
Rufe das Zertifikat ab, vergleiche seinen SHA-256-Fingerabdruck mit dem, der auf dem Registry-Host angezeigt wird, und füge es dann mit NODE_EXTRA_CA_CERTS (oder über cafile von npm) hinzu.
bash # Save the registry's certificate, check its fingerprint, and trust exactly this file openssl s_client -connect registry.example.com:443 -servername registry.example.com </dev/null 2>/dev/null \ | openssl x509 -out registry.pem openssl x509 -in registry.pem -noout -fingerprint -sha256 NODE_EXTRA_CA_CERTS=$PWD/registry.pem npm install - 2.
Private Registry auf deinen Scope beschränken
Leitest du nur den Scope deiner Organisation an die private Registry, bleiben alle öffentlichen Pakete auf registry.npmjs.org, und ein Zertifikatsproblem auf dem privaten Host kann sie nicht beeinträchtigen.
ini ; .npmrc — only @acme packages come from the private registry; the rest from npmjs @acme:registry=https://registry.example.com/ - 3.
Der Registry ein von einer CA ausgestelltes Zertifikat geben
Ein Zertifikat einer öffentlichen CA (ACME) oder der Firmen-CA, der deine Rechner bereits vertrauen, macht Ausnahmen für einzelne Zertifikate überflüssig.
bash # Give the registry a certificate from a CA your machines trust (public ACME or company CA) sudo certbot certonly --standalone -d registry.example.com