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

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

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. Обычно это локальные серверы разработки, внутренние инструменты и сервисы, которые до сих пор используют сертификат, сгенерированный при установке.

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

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

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

    Временная диагностика: rejectUnauthorized: false

    Агент начинает принимать любой сертификат, в том числе сертификат злоумышленника. Допустимо только для быстрой локальной проверки и никогда — в коде, который идёт в релиз.

    js
    // Temporary diagnostic in a test only: accepts ANY certificate on this agent
    const agent = new https.Agent({ rejectUnauthorized: false });

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

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