本文へスキップ
ecdsa.com
Node.js tls / https / fetchNode.js の crypto

エラーメッセージ

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.

    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 を使う

    一度信頼したローカルのルート(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 });

関連するエラー

署名エラーデータベースをすべて見る