エラーメッセージ
npm error code SELF_SIGNED_CERT_IN_CHAIN
別の表記
- npm ERR! code SELF_SIGNED_CERT_IN_CHAIN
- npm error request to https://registry.example.com/lodash failed, reason: self-signed certificate in certificate chain
npm 10 以降は「npm error code SELF_SIGNED_CERT_IN_CHAIN」、npm 9 以前は「npm ERR! code SELF_SIGNED_CERT_IN_CHAIN」と出力します。続く行では、コードが errno として繰り返され、URL が「reason: self-signed certificate in certificate chain」とともに示されます。
npm (Node.js) — registry request over HTTPS
このエラーの意味
レジストリへの接続で提示された証明書チェーンが、Node.js の知らない自己署名のルートで終わっています。registry.npmjs.org の場合、これは通信が傍受されて再署名されていることを意味します。ほぼ必ず、社内プロキシか HTTPS スキャン機能を持つウイルス対策製品によるもので、そのルートはブラウザーには信頼されていても、npm には信頼されていません。
発生する理由
TLS を検査する社内プロキシ
よくあるZscaler、Netskope、Palo Alto、Fortinet などの製品は、マシンとレジストリの間に入り、独自のルートをチェーンに含めて提示します。
HTTPS スキャン機能を持つウイルス対策ソフトやエンドポイント保護製品
ときどき一部のエンドポイント製品は、マシン上でローカルに TLS を傍受し、独自のルートを OS のストアにだけ追加します。
独自のルートを送信するプライベートレジストリ
ときどき社内 CA で署名され、チェーンにルートを含めて返す社内レジストリでも、そのルートを Node.js に信頼させる必要があります。
修正方法
- 1.
cafile でプロキシのルートを npm に渡す
ルート証明書(IT 部門から入手するか、OS のトラストストアから取得します)を PEM 形式でエクスポートし、npm の cafile に設定してください。設定後の npm はそのファイル内の CA だけを信頼するため、社内ネットワークの外でも使うノートパソコンでは、同じファイルにパブリックルートも追加するか、NODE_EXTRA_CA_CERTS を優先して使ってください。
bash npm config set cafile /etc/ssl/private-ca/corp-proxy-root.pem npm install - 2.
または NODE_EXTRA_CA_CERTS を設定する
Node.js のパブリックルートを置き換えることなく、npm とその他すべての Node.js ツールにルートを追加します。Windows では、ユーザー環境変数として設定し、新しいターミナルを開いてください。
bash # Windows (PowerShell): setx NODE_EXTRA_CA_CERTS C:\certs\corp-proxy-root.pem export NODE_EXTRA_CA_CERTS=/etc/ssl/private-ca/corp-proxy-root.pem npm install - 3.
または Node.js に OS のストアを使わせる
NODE_USE_SYSTEM_CA=1 を設定すると、Node.js(と npm)はオペレーティングシステムが信頼するものを信頼するようになります。管理対象のマシンでは、そこにプロキシのルートも含まれます。
bash # Managed machines already trust the proxy root in the OS store NODE_USE_SYSTEM_CA=1 npm install - 4.
一時的な診断:--strict-ssl=false
信頼の問題であることを確かめるためだけに使ってください。パッケージはインストールスクリプトを実行するため、検証されていないダウンロードを受け入れることは、まさにサプライチェーン攻撃が開発者のマシンに入り込む経路です。strict-ssl=false を .npmrc に書いてはいけません。
bash # Temporary diagnostic for one command only npm install --strict-ssl=false
関連するエラー
self-signed certificate in certificate chainNode.js tls / https / fetchnpm error code UNABLE_TO_GET_ISSUER_CERT_LOCALLYnpm (Node.js)error Error: self-signed certificate in certificate chainYarn Classic (1.x)Error: ERR_PNPM_RESOLVING_NPM_RESOLVER_NETWORK_ERRORpnpm 12 (native binary, rustls)fatal: unable to access 'https://git.example.com/team/app.git/': SSL certificat…git over HTTPS with libcurl + OpenSSL (Git for Windows default, macOS Homebrew, Alpine, RHEL)