Перейти к содержимому
ecdsa.com
Node.js tls / https / fetchМодуль crypto в Node.js

Сообщение об ошибке

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.

Почему это происходит

Как исправить

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

Связанные ошибки

Открыть всю базу ошибок подписей