Aller au contenu
ecdsa.com
Node.js tls / https / fetchNode.js crypto

Message d’erreur

certificate has expired

Également affiché sous la forme

  • code: 'CERT_HAS_EXPIRED'
  • CERT_HAS_EXPIRED

Le texte du message est identique dans toutes les versions de Node.js ; avec fetch(), il apparaît comme cause de « TypeError: fetch failed », et npm affiche « npm error code CERT_HAS_EXPIRED ». Les certificats qui ne sont pas encore valides produisent à la place CERT_NOT_YET_VALID.

Node.js tls / https / fetch — code CERT_HAS_EXPIRED (OpenSSL X509_V_ERR_CERT_HAS_EXPIRED, 10)

Ce que cela signifie

Un certificat de la chaîne construite par Node.js a dépassé sa date notAfter selon l’horloge de cette machine. Il s’agit généralement du certificat du serveur lui-même ; ce peut aussi être un certificat intermédiaire que le serveur envoie encore, ou une racine issue de la liste obsolète fournie avec une ancienne version de Node.js. Node.js signale le message « certificate has expired » avec le code CERT_HAS_EXPIRED.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Lire les dates du certificat servi

    Connectez-vous une fois sans vérification, uniquement pour lire le certificat : valid_to et authorizationError indiquent quel certificat a expiré. N’envoyez aucune donnée sur cette connexion.

    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.

    Renouveler et recharger le certificat du serveur

    Renouvelez via le client ACME ou l’AC, rechargez chaque processus qui termine TLS, puis confirmez la nouvelle date d’expiration côté réseau.

    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.

    Mettre à jour Node.js sur les anciennes installations

    Si le certificat du serveur est valide pour les autres clients, la liste de racines d’un ancien Node.js est probablement en cause ; passer à une version maintenue actualise les racines fournies.

    bash
    # Node.js bundles its root list: old releases carry old (or expired) roots
    node -v
    node -p "require('tls').rootCertificates.length"

Erreurs associées

Parcourir toute la base de données des erreurs de signature