Сообщение об ошибке
certificate has expired
Также выводится как
- code: 'CERT_HAS_EXPIRED'
- CERT_HAS_EXPIRED
Текст сообщения одинаков во всех версиях Node.js; при использовании fetch() оно указывается как причина ошибки «TypeError: fetch failed», а npm выводит «npm error code CERT_HAS_EXPIRED». Для сертификатов, которые ещё не действительны, вместо него выдаётся CERT_NOT_YET_VALID.
Node.js tls / https / fetch — code CERT_HAS_EXPIRED (OpenSSL X509_V_ERR_CERT_HAS_EXPIRED, 10)
Что это означает
По часам этой машины дата notAfter одного из сертификатов в цепочке, которую построил Node.js, уже прошла. Обычно это собственный сертификат сервера; но это может быть и промежуточный сертификат, который сервер всё ещё отправляет, или корневой из устаревшего списка, встроенного в старый релиз Node.js. Node.js выдаёт сообщение «certificate has expired» с кодом CERT_HAS_EXPIRED.
Почему это происходит
Сертификат сервера не продлили или не перезагрузили
частоПродление незаметно завершилось ошибкой, или новый сертификат уже лежит на диске, а сервер, балансировщик нагрузки или CDN всё ещё отдаёт старый.
Старый Node.js с устаревшим списком корневых сертификатов
иногдаNode.js встраивает корневые сертификаты Mozilla в исполняемый файл. Релиз, собранный до того, как CA перешёл на новый корневой сертификат, может знать только старый корневой сертификат, срок действия которого уже истёк, и строит путь сертификации через него, тогда как у современных клиентов проверка проходит.
Часы на машине идут неправильно
иногдаКонтейнеры наследуют часы хоста; у виртуальной машины, восстановленной из снимка, или у устройства без часов реального времени время может сильно отличаться от настоящего.
Как исправить
- 1.
Посмотрите даты сертификата, который отдаёт сервер
Подключитесь один раз без проверки, только чтобы прочитать сертификат: valid_to и authorizationError покажут, у какого сертификата истёк срок действия. Не передавайте данные через это соединение.
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.
Продлите сертификат сервера и перезагрузите его
Продлите сертификат через ACME-клиент или CA, перезагрузите каждый процесс, который терминирует TLS, а затем убедитесь, подключившись по сети, что срок действия обновился.
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.
Обновите Node.js на старых установках
Если для других клиентов сертификат сервера действителен, скорее всего, виноват устаревший список корневых сертификатов в Node.js; переход на поддерживаемый релиз обновляет и встроенные корневые сертификаты.
bash # Node.js bundles its root list: old releases carry old (or expired) roots node -v node -p "require('tls').rootCertificates.length"
Связанные ошибки
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)