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
O certificado do servidor não foi renovado ou não foi recarregado
comumA renovação falhou sem aviso, ou o novo certificado está no disco enquanto o servidor, o balanceador de carga ou a CDN ainda apresenta o antigo.
Um Node.js antigo, com uma lista de raízes desatualizada
ocasionalO Node.js compila as raízes da Mozilla no binário. Uma versão compilada antes de uma CA migrar para uma nova raiz pode conhecer só a raiz antiga, agora expirada, e monta o caminho por ela, enquanto clientes atualizados conseguem se conectar.
O relógio da máquina está errado
ocasionalContêineres herdam o relógio do host; uma VM restaurada de um snapshot ou um dispositivo sem relógio de tempo real pode estar com o horário muito errado.
Como corrigir
- 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.
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.
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
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)