エラーメッセージ
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 サーバー
よくある開発用サーバー(https を有効にした Vite や webpack、ローカルの API ゲートウェイ、docker-compose のスタック)は自己署名証明書を作成しますが、Node.js のスクリプト、テスト、SSR のコードはその証明書を信頼しません。
社内ツールとアプライアンス
よくあるCA が発行した証明書が一度も設定されていないセルフホストのサービス(Jenkins、Grafana、Elasticsearch、ルーターや NAS の管理画面)が該当します。
プロキシが組み込みのデフォルト証明書を返している
ときどきIngress コントローラーやリバースプロキシは、要求された名前に一致する証明書が設定されていない場合、自己署名のデフォルト証明書を提示します。
修正方法
- 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.
プロセス全体に証明書を追加する
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 を使う
一度信頼したローカルのルート(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)