Mensaje de error
certificate has expired
También se muestra como
- code: 'CERT_HAS_EXPIRED'
- CERT_HAS_EXPIRED
El texto del mensaje es el mismo en todas las versiones de Node.js; con fetch() aparece como causa de «TypeError: fetch failed», y npm imprime «npm error code CERT_HAS_EXPIRED». Los certificados que aún no son válidos producen en su lugar CERT_NOT_YET_VALID.
Node.js tls / https / fetch — code CERT_HAS_EXPIRED (OpenSSL X509_V_ERR_CERT_HAS_EXPIRED, 10)
Qué significa
Un certificado de la cadena que construyó Node.js ha superado su fecha notAfter según el reloj de este equipo. Normalmente es el propio certificado del servidor; también puede ser un intermedio que el servidor sigue enviando, o una raíz de la lista obsoleta incluida en una versión antigua de Node.js. Node.js informa del mensaje «certificate has expired» con el código CERT_HAS_EXPIRED.
Por qué ocurre
El certificado del servidor no se renovó o no se recargó
frecuenteLa renovación falló sin avisar, o el certificado nuevo está en el disco mientras el servidor, el balanceador de carga o la CDN siguen sirviendo el antiguo.
Un Node.js antiguo con una lista de raíces obsoleta
ocasionalNode.js compila las raíces de Mozilla dentro del binario. Una versión compilada antes de que una CA pasara a una raíz nueva puede conocer solo la raíz antigua, ya caducada, y construye su ruta de certificación a través de ella, mientras que los clientes actuales lo consiguen sin problemas.
El reloj del equipo está mal
ocasionalLos contenedores heredan el reloj del host; una VM restaurada desde una instantánea o un dispositivo sin reloj en tiempo real pueden ir muy desfasados.
Cómo solucionarlo
- 1.
Leer las fechas del certificado servido
Conéctate una vez sin verificación, solo para leer el certificado: valid_to y authorizationError muestran qué certificado caducó. No envíes datos por esa conexión.
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.
Renovar y recargar el certificado del servidor
Renueva mediante el cliente ACME o la CA, recarga todos los procesos que terminan TLS y luego confirma la nueva fecha de caducidad desde el lado de la red.
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.
Actualizar Node.js en instalaciones antiguas
Si el certificado del servidor es válido para otros clientes, la culpable probable es la lista de raíces de un Node.js antiguo; actualizar a una versión con mantenimiento renueva las raíces incluidas.
bash # Node.js bundles its root list: old releases carry old (or expired) roots node -v node -p "require('tls').rootCertificates.length"
Errores relacionados
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)