Zum Inhalt springen
ecdsa.com
Node.js tls / https / fetchNode.js crypto

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

So behebst du den Fehler

  1. 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. 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. 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

Gesamte Signaturfehler-Datenbank durchsuchen