エラーメッセージ
npm error code DEPTH_ZERO_SELF_SIGNED_CERT
別の表記
- npm ERR! code DEPTH_ZERO_SELF_SIGNED_CERT
npm 10 以降は「npm error code DEPTH_ZERO_SELF_SIGNED_CERT」、npm 9 以前は「npm ERR! code DEPTH_ZERO_SELF_SIGNED_CERT」と出力します。理由の行は「self-signed certificate」で、最近の Node.js のバージョンでは --use-system-ca のヒントが付きます。
npm (Node.js) — registry request over HTTPS
このエラーの意味
npm の接続先レジストリが、Node.js の信頼していない自己署名証明書を 1 枚だけ提示しました。CA のチェーンはまったく存在しないため、解決策は、その証明書そのものを意図的に信頼するか、CA が発行した証明書をレジストリに設定するかのどちらかしかありません。生成された証明書で起動したローカルまたはセルフホストのレジストリでよく起こります。
発生する理由
生成された証明書を使うローカルまたはセルフホストのレジストリ
よくあるVerdaccio、Nexus や Artifactory の試用版、または自己署名証明書で起動したレジストリのコンテナーが該当します。
出荷時の証明書を使うアプライアンスやプロキシ
ときどき一部のキャッシュプロキシやネットワークアプライアンスは、正式な証明書がインストールされるまで自己署名証明書を提示します。
デフォルトの証明書で応答する Kubernetes の Ingress
ときどきIngress にレジストリのホストが設定されていない場合、Ingress は自己署名のデフォルト証明書を返します(ingress-nginx では「Kubernetes Ingress Controller Fake Certificate」)。
修正方法
- 1.
この証明書だけを信頼する
証明書を取得し、その SHA-256 フィンガープリントをレジストリのホスト上で表示されるものと比較してから、NODE_EXTRA_CA_CERTS(または npm の cafile)で追加してください。
bash # Save the registry's certificate, check its fingerprint, and trust exactly this file openssl s_client -connect registry.example.com:443 -servername registry.example.com </dev/null 2>/dev/null \ | openssl x509 -out registry.pem openssl x509 -in registry.pem -noout -fingerprint -sha256 NODE_EXTRA_CA_CERTS=$PWD/registry.pem npm install - 2.
プライベートレジストリを自組織のスコープに限定する
自組織のスコープだけをプライベートレジストリに振り分ければ、公開パッケージはすべて registry.npmjs.org から取得されるため、プライベートなホストで証明書の問題が起きても影響を受けません。
ini ; .npmrc — only @acme packages come from the private registry; the rest from npmjs @acme:registry=https://registry.example.com/ - 3.
CA が発行した証明書をレジストリに設定する
パブリック CA(ACME)の証明書、またはマシンがすでに信頼している社内 CA の証明書を使えば、証明書ごとの例外は不要になります。
bash # Give the registry a certificate from a CA your machines trust (public ACME or company CA) sudo certbot certonly --standalone -d registry.example.com