Fehlermeldung
certificate has expired
Auch ausgegeben als
- code: 'CERT_HAS_EXPIRED'
- CERT_HAS_EXPIRED
Der Text der Meldung ist in allen Node.js-Versionen gleich; bei fetch() erscheint er als Ursache (cause) von „TypeError: fetch failed“, npm gibt „npm error code CERT_HAS_EXPIRED“ aus. Zertifikate, die noch nicht gültig sind, erzeugen stattdessen CERT_NOT_YET_VALID.
Node.js tls / https / fetch — code CERT_HAS_EXPIRED (OpenSSL X509_V_ERR_CERT_HAS_EXPIRED, 10)
Was der Fehler bedeutet
Ein Zertifikat in der Kette, die Node.js gebildet hat, hat nach der Uhr dieses Rechners sein notAfter-Datum überschritten. Meist ist es das Zertifikat des Servers selbst; es kann auch ein Zwischenzertifikat sein, das der Server noch mitsendet, oder ein Root-Zertifikat aus der veralteten Liste, die mit einem alten Node.js-Release gebündelt ist. Node.js gibt die Meldung „certificate has expired“ mit dem Code CERT_HAS_EXPIRED aus.
Warum der Fehler auftritt
Das Zertifikat des Servers wurde nicht erneuert oder nicht neu geladen
häufigDie Erneuerung ist unbemerkt fehlgeschlagen, oder das neue Zertifikat liegt auf der Festplatte, während Server, Load Balancer oder CDN noch das alte ausliefern.
Ein altes Node.js mit veralteter Root-Liste
gelegentlichNode.js kompiliert die Root-Zertifikate von Mozilla in die Binärdatei ein. Ein Release, das gebaut wurde, bevor eine CA auf ein neues Root-Zertifikat umgestellt hat, kennt womöglich nur das alte, inzwischen abgelaufene Root-Zertifikat und baut seinen Pfad darüber auf, während aktuelle Clients die Verbindung problemlos aufbauen.
Die Uhr des Rechners geht falsch
gelegentlichContainer übernehmen die Uhr des Hosts; eine aus einem Snapshot wiederhergestellte VM oder ein Gerät ohne Echtzeituhr kann weit danebenliegen.
So behebst du den Fehler
- 1.
Datumsangaben des ausgelieferten Zertifikats lesen
Verbinde dich einmal ohne Prüfung, nur um das Zertifikat zu lesen: valid_to und authorizationError zeigen, welches Zertifikat abgelaufen ist. Sende über diese Verbindung keine Daten.
js // Read the dates of the served certificate (inspection only, nothing is sent) import tls from "node:tls"; const socket = tls.connect({ host: "api.example.com", port: 443, servername: "api.example.com", rejectUnauthorized: false }, () => { const cert = socket.getPeerCertificate(); console.log(cert.subject.CN, cert.valid_from, "->", cert.valid_to, "authorized:", socket.authorized, socket.authorizationError); socket.end(); }); - 2.
Serverzertifikat erneuern und neu laden
Erneuere das Zertifikat über den ACME-Client oder die CA, lade jeden Prozess neu, der TLS terminiert, und prüfe dann von der Netzwerkseite aus das neue Ablaufdatum.
bash sudo certbot renew && sudo systemctl reload nginx echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null | openssl x509 -noout -enddate - 3.
Node.js auf alten Installationen aktualisieren
Ist das Zertifikat des Servers für andere Clients gültig, ist wahrscheinlich eine alte Root-Liste von Node.js schuld; ein Upgrade auf ein gepflegtes Release aktualisiert die mitgelieferten Root-Zertifikate.
bash # Node.js bundles its root list: old releases carry old (or expired) roots node -v node -p "require('tls').rootCertificates.length"
Verwandte Fehler
npm error code CERT_HAS_EXPIREDnpm (Node.js)curl: (60) SSL certificate problem: certificate has expiredcurl (OpenSSL backend)x509: certificate has expired or is not yet valid: current time 2026-08-20T15:4…Go crypto/x509[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has exp…Python ssl module (OpenSSL)