プロキシ環境における npm install でパッケージをインストールするための設定

プロキシ環境において npm install でパッケージをインストールする際によく起こるエラーやその対処方法について纏めています。

やりたいこと

いつも通り npm init を行ったところ以下のようなエラーが出ました。

(node:16752) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 close listeners added to [TLSSocket]. Use emitter.setMaxListeners() to increase limit npm WARN init canceled

感覚的にプロキシ環境化で TLSSocket のエラーを見たらプロキシ設定や TLS 証明書検証の失敗を疑います。

以下の通り npm は、環境変数 HTTPS_PROXYhttps_proxyHTTP_PROXYhttp_proxy が設定されている場合は、プロキシアドレスとして解釈してくれるので、他のアプリケーション等でこれらの環境変数を設定していた場合は、npm initnpm install は正常にワークするため、何かの拍子にこれらの環境変数を削除してしまうとたちまち上記のようなエラーが出て、npm init すら出来なくなったりします。

A proxy to use for outgoing https requests. If the HTTPS_PROXY or https_proxy or HTTP_PROXY or http_proxy environment variables are set, proxy settings will be honored by the underlying request library. - config | npm Docs

環境変数でのプロキシ設定は他の言語のパッケージ管理アプリケーションでも使用することが多いので、誤って削除や変更したときの影響が大きいので、各パッケージ管理アプリケーションで管理できた方がベターだと思います。 (なお今回は pip のプロキシ設定の検証の関係で環境変数を消したままにしてしまっていたことが原因でした…)

環境

OS
Microsoft Windows 21H2
npm
9.5.1

npm のプロキシ設定

npm はコンフィグでプロキシ情報を設定することができるので、環境変数に頼らずこちらで設定することにします。

以下コマンドでプロキシ情報を設定します。基本的に全部 https だと思うので https-proxy だけで問題ないとは思いますが、念のため proxy も設定しています。

npm -g config set proxy "http://<IP>:<PORT>"
npm -g config set https-proxy "http://<IP>:<PORT>"

設定後、以下コマンドでコンフィグの設定内容を確認できますので、proxyhttps-proxy が設定されているか確認しましょう。

npm -g config list

なお、設定したコンフィグの削除は以下のコマンドで行います。

npm -g config delete proxy 
npm -g config delete https-proxy 

TLS インスペクション環境化で証明書エラーが発生する場合

企業の環境等で TLS インスペクション環境で npm install を実行する場合、以下のようなエラーがいくつか発生することがあります。

エラーその 1

npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE
npm ERR! errno UNABLE_TO_VERIFY_LEAF_SIGNATURE
npm ERR! request to https://registry.npmjs.org/xxxx failed, reason: unable to verify the first certificate

エラーその 2

npm ERR! code UNABLE_TO_GET_ISSUER_CERT
npm ERR! errno UNABLE_TO_GET_ISSUER_CERT
npm ERR! request to https://registry.npmjs.org/xxxx failed, reason: unable to get issuer certificate

エラーその 3

npm ERR! code SELF_SIGNED_CERT_IN_CHAIN
npm ERR! errno SELF_SIGNED_CERT_IN_CHAIN
npm ERR! request to https://registry.npmjs.org/xxxx failed, reason: self signed certificate chain

この場合は、以下コマンドで一時的に証明書検証をオフにすることで証明書検証をスキップできます。

npm -g config strict-ssl false

strict-ssl
Default: true
Type: Boolean
Whether or not to do SSL key validation when making requests to the registry via https. - config | npm Docs

ただし、この方法は証明書検証を全てスキップすることになるのであまりお勧めしません。もしこの方法をとる場合は、インストールが終わったら再び証明書検証はオンに戻しておきましょう。

npm -g config strict-ssl true

本質的には TLS インスペクションに使用されている自己署名証明書を登録するべきです。証明書の特定と取得方法は こちらの記事 で紹介しているので、よろしければ参考にしてください。

証明書が用意出来たら以下のコマンドで設定できます。パスは絶対パスにしてください。

npm -g config cafile c:\path\to\cert\pem\file.pem

cafile
Default: null
Type: Path
A path to a file containing one or multiple Certificate Authority signing certificates. - config | npm Docs

これでエラーは解消されます。

あとがき

プロキシ環境って何かと不便ですよね…。ただ原因はどのようなパッケージマネージャーでもだいたい同じなので慣れてくるとこのパッケージマネージャーだとどう設定するんだろうみたいな思考回路になってきます。