Pular para o conteúdo
ecdsa.com
Node.js tls / https / fetchMódulo crypto do Node.js

Mensagem de erro

certificate has expired

Também aparece como

  • code: 'CERT_HAS_EXPIRED'
  • CERT_HAS_EXPIRED

O texto da mensagem é o mesmo em todas as versões do Node.js; com fetch(), ele aparece como a causa de “TypeError: fetch failed”, e o npm imprime “npm error code CERT_HAS_EXPIRED”. Certificados que ainda não são válidos produzem CERT_NOT_YET_VALID em vez disso.

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

O que significa

Um certificado da cadeia montada pelo Node.js passou da data notAfter segundo o relógio desta máquina. Normalmente é o próprio certificado do servidor; também pode ser um intermediário que o servidor ainda envia, ou uma raiz da lista desatualizada embutida em uma versão antiga do Node.js. O Node.js informa a mensagem “certificate has expired” com o código CERT_HAS_EXPIRED.

Por que acontece

Como corrigir

  1. 1.

    Ler as datas do certificado apresentado

    Conecte-se uma vez sem verificação, só para ler o certificado: valid_to e authorizationError mostram qual certificado expirou. Não envie dados por essa conexão.

    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 e recarregar o certificado do servidor

    Renove pelo cliente ACME ou pela CA, recarregue todos os processos que fazem a terminação TLS e depois confirme a nova data de expiração pelo lado da rede.

    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.

    Atualizar o Node.js em instalações antigas

    Se o certificado do servidor é válido para outros clientes, a provável culpada é uma lista de raízes antiga do Node.js; atualizar para uma versão com suporte renova as raízes embutidas.

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

Erros relacionados

Ver toda a base de erros de assinatura