[解決済み] WindowsでNpmを実行するときにSSL証明書エラーを修正する方法は?
質問
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_PROXY
と
HTTPS_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を参照してください。
関連
-
"Failed to load resource: net::ERR_FILE_NOT_FOUND" エラー。vue-cli 3.0 プロジェクトを作成し、dev で実行すると、パッケージング後にエラーが報告され、ページが空白になります。
-
[解決済み] sudoを使わずにnpmがエラーを投げるのを修正する方法
-
[解決済み] Node.jsのnpmモジュールをアンインストールするにはどうすればよいですか?
-
[解決済み] NPMパッケージの以前の正確なバージョンをインストールするにはどうすればよいですか?
-
[解決済み] GitHubからnpmパッケージを直接インストールする方法
-
[解決済み] npmのユーザーインストール済みパッケージの一覧を表示する方法は?
-
[解決済み] npm install」と「npm ci」の違いは何ですか?
-
[解決済み] 受信エラー:'Error: SSL Error: SELF_SIGNED_CERT_IN_CHAIN' を受信している。
-
[解決済み】Windowsでnpmをアップデートするにはどうすればいいですか?
-
[解決済み] npm -Dフラグの意味は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
レポート:spawn cmd ENOENTエラーの起動に失敗しました。
-
エラーを解決する。ENOENT: no such file or directory, scandir install node-sass error.
-
[解決済み] yarn runとnpm startの違いは何ですか?
-
[解決済み] npm install」と「npm ci」の違いは何ですか?
-
[解決済み] package-lock.jsonの役割は何ですか?
-
[解決済み] node.jsのhttps.requestで無効な自己署名入りssl証明書を無視する?
-
[解決済み】UbuntuにBowerをインストールする。
-
[解決済み] npmパッケージのサイズを表示する方法を教えてください。
-
[解決済み] なぜ package-lock.json は整合性ハッシュを sha1 から sha512 に変更したのですか?
-
[解決済み] 特定のフォルダをパッケージのルートとしてnpmで公開する方法