Fehlermeldung
npm error code CERT_HAS_EXPIRED
Auch ausgegeben als
- npm ERR! code CERT_HAS_EXPIRED
- npm error request to https://registry.example.com/lodash failed, reason: certificate has expired
npm 10 und neuer geben „npm error code CERT_HAS_EXPIRED“ aus, npm 9 und älter „npm ERR! code CERT_HAS_EXPIRED“. Die folgenden Zeilen nennen die URL mit „reason: certificate has expired“.
npm (Node.js) — registry request over HTTPS
Was der Fehler bedeutet
Ein Zertifikat in der Kette, die npm von der Registry (oder von einem Proxy dazwischen) erhalten hat, hat nach der Uhr dieses Rechners sein Ablaufdatum überschritten. Bei der öffentlichen Registry heißt das fast nie, dass das Zertifikat von npm selbst abgelaufen ist: Es deutet auf eine alte CA, die in deiner npm-Konfiguration fest eingetragen ist, eine veraltete Root-Liste von Node.js, ein Proxy-Zertifikat oder eine falsch gehende Uhr hin. Bei privaten Registrys kann das Zertifikat des Servers tatsächlich abgelaufen sein.
Warum der Fehler auftritt
Das Zertifikat der privaten Registry ist abgelaufen
häufigSelbst gehostete Instanzen von Nexus, Artifactory oder Verdaccio und Firmenproxys, deren Zertifikate von Hand erneuert werden.
Ein sehr altes Node.js mit veralteten Root-Zertifikaten
gelegentlichNode.js liefert seine Root-Liste in der Binärdatei mit; Releases, die vor dem Root-Wechsel einer CA erschienen sind, kennen womöglich nur das abgelaufene Root-Zertifikat und scheitern dort, wo aktuelle Releases funktionieren.
Eine alte CA, fest eingetragen in der Einstellung ca oder cafile
gelegentlichEin Eintrag ca= oder cafile=, der vor Jahren in der .npmrc stehen geblieben ist, ersetzt bei Registry-Anfragen die Standard-Root-Zertifikate von Node.js, sodass npm weiterhin gegen dieses alte, inzwischen abgelaufene Zertifikat prüft.
Die Systemuhr geht falsch
gelegentlichPrüfe das Datum auf VMs, in Containern und auf Geräten ohne batteriegepufferte Uhr, bevor du die Konfiguration änderst.
So behebst du den Fehler
- 1.
Prüfen, welche Registry und welches Zertifikat betroffen sind
Lies die konfigurierte Registry und das Ablaufdatum des Zertifikats aus, das sie ausliefert. Ein abgelaufenes Zertifikat einer privaten Registry muss auf dem Server erneuert werden.
bash npm config get registry echo | openssl s_client -connect registry.example.com:443 -servername registry.example.com 2>/dev/null \ | openssl x509 -noout -subject -enddate - 2.
Veraltete Einstellungen ca oder cafile entfernen
npm config list zeigt die Einstellungen aus jeder .npmrc-Ebene; lösche Einträge ca oder cafile, die auf alte Zertifikate zeigen (oder aktualisiere die Datei, auf die sie verweisen).
bash # An old CA pinned in .npmrc replaces the default roots: list and remove it npm config list | grep -E '^;? *(ca|cafile)' npm config delete ca npm config delete cafile - 3.
Node.js und npm aktualisieren
Ein gepflegtes Node.js-Release bringt eine aktuelle Root-Liste mit; aktualisiere npm danach.
bash node -v && npm -v # Node.js bundles its root list; very old releases carry expired roots # upgrade Node.js to a maintained release (nvm, fnm, volta or your OS packages), then: npm install -g npm@latest