1. ホーム
  2. npm

[解決済み] WindowsでNpmを実行するときにSSL証明書エラーを修正する方法は?

2022-10-29 12:09:56

質問

npmでパッケージをインストールしようとすると、うまくいきません。長い間待たされた後、私は最終的に「トンネリングソケットが確立できませんでした、sutatusCode=403」というエラーを得ます。

$ npm install coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm ERR! Error: tunneling socket could not be established, sutatusCode=403
npm ERR!     at ClientRequest.onConnect (c:\Program Files\nodejs\node_modules\npm\node_modules\request\tunnel.js:148:19)
npm ERR!     at ClientRequest.g (events.js:193:14)
npm ERR!     at ClientRequest.EventEmitter.emit (events.js:123:20)
npm ERR!     at Socket.socketOnData (http.js:1393:11)
npm ERR!     at TCP.onread (net.js:403:27)

しかし、Webブラウザ(Google Chrome)で同じURLを参照すると、問題なく読み込まれます(脚注参照)。 https://registry.npmjs.org/coffee-script

何が問題なのか?


私はたまたまhttpsのプロキシを使用していますが、これが問題でないと確信しています。私は、環境変数 https_proxy を設定しました (npm の ユーザーガイド ). 環境変数が正しいことは、Python パッケージマネージャの pip はそれに正しく従っているからです。

この問題はSSL証明書に関するものだと思います。なぜなら、そのURLを wget でダウンロードすると、証明書に関する明示的なエラーが表示されます。

$ wget https://registry.npmjs.org/coffee-script
SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = c:/progra~1/wget/etc/wgetrc
--2012-12-17 12:14:07--  https://registry.npmjs.org/coffee-script
Resolving corpproxy... 10.254.215.35
Connecting to corpproxy|10.254.215.35|:8080... connected.
ERROR: cannot verify registry.npmjs.org's certificate, issued by `/C=US/ST=CA/L=Oakland/O=npm/OU=npm Certificate Authority/CN=npmCA/[email protected]':
  Unable to locally verify the issuer's authority.
To connect to registry.npmjs.org insecurely, use `--no-check-certificate'.
Unable to establish SSL connection.

どうすれば直るのでしょうか?セキュリティを損なわずに


私も、コントロール パネルのインターネット オプションで「信頼されたルート認証局」として「npmCA」証明書をインストールするまで、Web ブラウザで SSL 証明書エラーが発生することがありました (スクリーンショット

)


編集部:試しに 安全でない を回避するために https://npmjs.org/doc/config.html#strict-ssl

npm set strict-ssl false

それでもまだ、同じエラーでタイムアウトします

$ npm install coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm ERR! Error: tunneling socket could not be established, sutatusCode=403

どのように解決するのですか?

TL;DR - これを実行するだけで、セキュリティを無効にすることはありません。

既存の証明書を置き換える

# Windows/MacOS/Linux 
npm config set cafile "<path to your certificate file>"

# Check the 'cafile'
npm config get cafile

または 既存の証明書を拡張する

この環境変数を設定することで、あらかじめ定義された証明書を拡張することができます。 NODE_EXTRA_CA_CERTS"<path to certificate file>"

全文

Windowsのファイアウォールの内側で、npm、pip、mavenなどを使って仕事をしなければならないことがあります。これは楽しいことではありません。可能な限り、プラットフォームに依存しない、または意識しないようにしたいと思います。

HTTP_PROXY & HTTPS_PROXY

HTTP_PROXY & HTTPS_PROXY は、多くのソフトウェアがプロキシがどこにあるかを知るために使う環境変数です。Windows では、多くのソフトウェアが OS で指定されたプロキシを使用しますが、これはまったく別のものです。つまり、Chrome(インターネットオプションで指定したプロキシを使用)は問題なくURLに接続できるが、npm、pip、mavenなどはHTTPS_PROXYを使用しているので動作しない(HTTP_PROXYを使用している場合を除く-後述)。通常、環境変数は次のようなものになります。

http://proxy.example.com:3128

しかし、あなたは 403 が表示されるのは、プロキシに対して認証が行われていないことを示唆しています。もしプロキシで基本認証が行われているのであれば、環境変数に以下のような形式を設定します。

http://user:[email protected]:3128

恐るべき NTLM

HTTP ステータス コード 407 (プロキシ認証が必要) がありますが、これはリクエストを拒否しているのが宛先サーバーではなくプロキシであることを示す、より正しい方法です。このコードには長い間悩まされましたが、Google で調べたところ、私のプロキシは NTLM 認証 . HTTPの基本認証は、私の企業の支配者がインストールしたどんなプロキシでも満足させるのに十分ではありませんでした。そこで、私は Cntlm を使い、上流のプロキシに NTLM 認証をさせることにした。それから、NTLM を実行できないすべてのプログラムに、私のローカルマシンをプロキシとして使用するよう指示する必要がありました。 HTTP_PROXYHTTPS_PROXY . それ以外の場合は、(@Agusが提案するように)npmの使用について。

npm config set proxy http://proxy.example.com:3128
npm config set https-proxy http://proxy.example.com:3128

ウィルスが発生するため、すべてのHTTPSトラフィックを復号化する必要があります。

このセットアップが約 1 年間 (不格好に) 継続された後、企業の上層部はプロキシを変更することにしました。それだけでなく、NTLM を使用しなくなったのです! 確かに勇敢な新世界だ。しかし、悪意のあるソフトウェアの作者が HTTPS 経由でマルウェアを配信するようになったため、我々貧しい無実のユーザーを保護する唯一の方法は、すべての接続を中間者にして、我々に届く前に脅威をスキャンすることだったのである。ご想像のとおり、私は安心感に包まれました。

長い話を短くすると、自己署名証明書は npm にインストールする必要があり、そのためには SELF_SIGNED_CERT_IN_CHAIN :

npm config set cafile "<path to certificate file>"

あるいは NODE_EXTRA_CA_CERTS 環境変数に証明書ファイルを設定することもできます。

プロキシ/ファイアウォールの後ろでnpmを動作させることについて私が知っていることは、これですべてだと思います。誰かがそれを有用と感じることができますように。

編集 : この問題に対して、HTTPレジストリを使うか、あるいは NODE_TLS_REJECT_UNAUTHORIZED . これらは、中間者攻撃やリダイレクト攻撃にさらされてしまうので、良いアイデアとは言えません。パッケージのインストールを行うマシンの DNS レコードを簡単に偽装すれば、どこからのパッケージでも信用できることがわかります。HTTPS を動作させるのは大変な作業に思えるかもしれませんが、非常に推奨されることです。信頼できないコードを会社に入れる責任を負うことになったとき、その理由がわかるでしょう。

編集 2 : このため npm config set cafile <path> を設定すると、npm は既存の証明書を拡張するのではなく、そのファイルで提供された証明書のみを使用するようになることに留意してください。

既存の証明書を拡張したい場合(例えば会社の証明書で)、環境変数 NODE_EXTRA_CA_CERTS を使用してファイルへリンクするのが良い方法であり、多くの手間を省くことができます。参照 how-to-add-custom-certificate-authority-ca-to-nodejsを参照してください。