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
Le certificat du serveur n’a pas été renouvelé ou pas rechargé
fréquenteLe renouvellement a échoué silencieusement, ou le nouveau certificat est sur le disque alors que le serveur, le répartiteur de charge ou le CDN sert toujours l’ancien.
Une ancienne version de Node.js avec une liste de racines obsolète
occasionnelleNode.js compile les racines de Mozilla dans le binaire. Une version compilée avant qu’une AC ne passe à une nouvelle racine peut ne connaître que l’ancienne racine, aujourd’hui expirée ; elle construit alors son chemin par cette racine, tandis que les clients actuels réussissent.
L’horloge de la machine est fausse
occasionnelleLes conteneurs héritent de l’horloge de l’hôte ; une VM restaurée à partir d’un instantané ou un appareil sans horloge temps réel peut accuser un fort décalage.
Comment corriger l’erreur
- 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.
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.
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
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)