Saltar al contenido
ecdsa.com
Node.js tls / https / fetchcrypto de Node.js

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

Cómo solucionarlo

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

Explorar toda la base de datos de errores de firma