Сообщение об ошибке
code: 'DEPTH_ZERO_SELF_SIGNED_CERT'
Также выводится как
- self-signed certificate; if the root CA is installed locally, try running Node.js with --use-system-ca
- DEPTH_ZERO_SELF_SIGNED_CERT
Node.js 24.22 выводит сообщение в виде «self-signed certificate; if the root CA is installed locally, try running Node.js with --use-system-ca»; более старые релизы выводят просто «self-signed certificate» (до Node.js 17 — «self signed certificate»). Искать стоит по коду: он не меняется.
Node.js tls / https / fetch — error.message "self-signed certificate" (OpenSSL X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT, 18)
Что это означает
Сертификат сервера самоподписанный (он сам себе издатель, то есть находится на нулевой глубине цепочки — «depth zero»), и его нет среди сертификатов, которым доверяет Node.js. Node.js выдаёт сообщение «self-signed certificate» с кодом DEPTH_ZERO_SELF_SIGNED_CERT. Обычно это локальные серверы разработки, внутренние инструменты и сервисы, которые до сих пор используют сертификат, сгенерированный при установке.
Почему это происходит
Локальный HTTPS-сервер со сгенерированным сертификатом
частоСерверы разработки (Vite или webpack с https, локальные API-шлюзы, стеки docker-compose) создают самоподписанный сертификат, которому не доверяют скрипты Node.js, тесты и код SSR.
Внутренние инструменты и специализированные устройства
частоСервисы, развёрнутые на собственных серверах (Jenkins, Grafana, Elasticsearch, панели администрирования роутеров или NAS), которые так и не получили сертификат, выпущенный CA.
Прокси отдаёт встроенный сертификат по умолчанию
иногдаIngress-контроллеры и обратные прокси предъявляют самоподписанный сертификат по умолчанию, если запрошенному имени не соответствует ни один из настроенных сертификатов.
Как исправить
- 1.
Настройте доверие к этому сертификату для одного агента
Передайте сертификат сервера в параметре ca. Принимается только этот сертификат, а проверки имени хоста и срока действия остаются включёнными; учтите, что ca заменяет для этого агента корневые сертификаты по умолчанию.
js // Trust exactly this certificate for this agent (hostname and dates are still checked) import https from "node:https"; import fs from "node:fs"; const agent = new https.Agent({ ca: fs.readFileSync("localhost.pem") }); https.get("https://localhost:8443/", { agent }, (res) => res.resume()); - 2.
Добавьте сертификат для всего процесса
NODE_EXTRA_CA_CERTS одинаково действует для https, tls и fetch() и не требует изменений в коде.
bash # Whole process, including fetch(): add the certificate to the trusted set NODE_EXTRA_CA_CERTS=./localhost.pem node app.js - 3.
Используйте локальный CA для разработки
Локальный корневой CA, доверие к которому настраивается один раз (mkcert, step-ca), выпускает корректно подписанные сертификаты для каждого хоста разработки, и исключения для отдельных сертификатов становятся не нужны.
bash # Development: a local CA (mkcert) instead of one-off self-signed certificates mkcert -install && mkcert localhost 127.0.0.1 NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem" node app.js - 4.
Временная диагностика: rejectUnauthorized: false
Агент начинает принимать любой сертификат, в том числе сертификат злоумышленника. Допустимо только для быстрой локальной проверки и никогда — в коде, который идёт в релиз.
js // Temporary diagnostic in a test only: accepts ANY certificate on this agent const agent = new https.Agent({ rejectUnauthorized: false });
Связанные ошибки
self-signed certificate in certificate chainNode.js tls / https / fetchnpm error code DEPTH_ZERO_SELF_SIGNED_CERTnpm (Node.js)curl: (60) SSL certificate problem: self-signed certificatecurl (OpenSSL backend)[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certifi…Python ssl module (OpenSSL)