WindowsでNpmを実行しているときにSSL証明書エラーを修正するにはどうすればよいですか?


88

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/emailAddress=i@izs.me':
  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

:これは私がいる問題に似てstackoverflow.com/questions/11773509/...
nwinkler


回答:


142

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、ma​​venなどを操作する必要がありました。これは面白くありません。可能な場合は、このプラットフォームを不可知論/認識に保つようにします。

HTTP_PROXY&HTTPS_PROXY

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

http://proxy.example.com:3128

しかし、プロキシに対して認証されていないことを示唆する403を取得しています。プロキシでの基本認証の場合は、環境変数を次の形式に設定する必要があります。

http://user:pass@proxy.example.com:3128

恐ろしいNTLM

HTTPステータスコード407(プロキシ認証が必要)があります。これは、リクエストを拒否しているのは宛先サーバーではなくプロキシであると言うより正しい方法です。そのコードは、Googleで多くの時間を過ごした後、プロキシがNTLM認証を使用していることを知るまで、最も長い間私を悩ませていました。HTTP基本認証は、私の企業の大君主がインストールしたプロキシを満足させるのに十分ではありませんでした。ローカルマシン(認証されていない)でCntlmを使用することに頼り、アップストリームプロキシでNTLM認証を処理させました。次に、NTLMを実行できなかったすべてのプログラムに、ローカルマシンをプロキシとして使用するように指示する必要がHTTP_PROXYありましたHTTPS_PROXY。これは通常、設定とと同じくらい簡単です。それ以外の場合、npmの使用(@Agusが示唆するように):

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レジストリを使用するか、を設定して、この問題に対してHTTPSをオフにすることは非常に一般的な提案ですNODE_TLS_REJECT_UNAUTHORIZED。これらは、中間者攻撃またはリダイレクト攻撃にさらされる可能性があるため、適切なアイデアではありません。パッケージのインストールを実行しているマシン上のDNSレコードをすばやく偽装すると、どこからでもパッケージを信頼していることに気付くでしょう。HTTPSを機能させるのは大変な作業のように思われるかもしれませんが、強くお勧めします。あなたが信頼できないコードを会社に許可する責任があるとき、あなたはその理由を理解するでしょう。

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

環境変数NODE_EXTRA_CA_CERTSを使用してファイルにリンクすることで既存の証明書を(たとえば会社の証明書で)拡張したい場合は、これが方法であり、多くの手間を省くことができます。参照してくださいどのようにツーアドオンカスタム認証局-CA-TO-nodejs


9
Windowsでは、スラッシュを使用する必要がありました。npmconfig set cafile "C:/dev/Firefox/mycert.cer"
John Jesus

4
**等号なし= npm config set cafile "<path to your certificate file>"
Moti Winkler

3
これは素晴らしい応答です-プロキシ+ zscalarに関する自分の頭痛の種をこれ以上要約することはできませんでした
Jpnh

7
「ご想像のとおり、安心感に打ち勝ちました」と大笑いしました。:)
マリオB

3
証明書ファイルを取得するにはどうすればよいですか?
アディティア2018

36

この問題は、httpバージョンのリポジトリを使用することで修正されました。

npm config set registry http://registry.npmjs.org/

52
それは非常に悪い解決策です!
KiT O 2014

4
@HaBo彼はこれが安全でないことを意味していると思います。
gabeio 2014

3
@KiTOそれは悪い解決策だと同意した。しかし、いくつかのパッケージをインストールしたいだけなのに、なぜ証明書の問題をいじる必要があるのでしょうか。
Ich 2015

17
この答えは正しいです。独自の証明書チェーンが他の証明書チェーンの上にある企業プロキシの混乱の背後にいて、これ以外の方法がない場合があります(証明書を無効にする以外に)(特に管理者権限が与えられていない場合)。これは、システムから適切な設定を適切にロードしないnpmバグのように聞こえます。ただし、相互互換性のために、npmは修正されないため、これはその結果です。それは悪い答えだと言う人々は、彼らが何について話しているのか分かりません。
kenorb 2016

3
@kenorbは正しくありません。プロキシが実行する手順をたどり、cafileを使用してそれらの自己署名証明書をチェーンに追加できます。
dardo 2018年

15
npm config set strict-ssl false

私のために問題を解決しました。この場合、エージェントとアーティファクト保管庫の両方がawsクラウドのプライベートサブネットの背後にあります


7

私は同じ問題を抱えています、私は使用を克服します

npm config set proxy http://my-proxy.com:1080
npm config set https-proxy http://my-proxy.com:1080

さらにnode-docの情報


6

私は数日前にこの同様のSSL問題に偶然遭遇しました。問題は、npmがhttps://registry.npmjs.orgで使用される証明書のルート証明書を設定していないことです。

ソリューション:

  1. wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crtwgetの問題を修正するために使用
  2. npm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crtnpmプログラムのルート証明書を設定するために使用します。

ルート証明書は次の場所からダウンロードできます。 https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt

注意:プログラムが異なれば、ルート証明書の管理方法も異なる可能性があるため、ブラウザを他のブラウザと混在させないでください。

分析:

wget https://registry.npmjs.org/coffee-script最初に問題を修正しましょう。あなたのスニペットは言う:

        エラー:registry.npmjs.orgの証明書を確認できません。
        / C = US / ST = CA / L = Oakland / O = npm / OU = npmによって発行されました 
       認証局/CN=npmCA/emailAddress=i@izs.me:
       発行者の権限をローカルで確認できません。

これは、wgetプログラムがhttps://registry.npmjs.orgの証明書を検証できないことを意味します。この問題を引き起こす可能性のある2つの理由があります。

  1. wgetプログラムには、このドメインのルート証明書がありません。ルート証明書は通常、システムに付属しています。
  2. ドメインはルート証明書を自分の証明書にパックしません。

したがって、ソリューションは明示的にのルート証明書を設定しhttps://registry.npmjs.orgます。opensslを使用して、以下の理由が問題であることを確認できます。

openssl s_client -host registry.npmjs.org -port 443コマンドラインで試してみると、次のメッセージが表示されます(最初の数行)。

    接続済み(00000003)
    depth = 1 / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
    エラーの確認:num = 20:ローカル発行者証明書を取得できません
    リターンの確認:0
    ---
    証明書チェーン
     0秒:/C=US/ST=California/L=SanFrancisco/O=Fastly,Inc./CN=a.sni.fastly.net
       i:/ C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
     1秒:/C=US/O=DigiCertInc/OU=www.digicert.com/CN=DigiCert High Assurance CA-3
       i:/ C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance EV Root CA
    ---

この行 verify error:num=20:unable to get local issuer certificateは、https://registry.npmjs.orgルート証明書がパックされていないことを確認します。したがって、GoogleのDigiCert High Assurance EV Root CAルート証明書です。


テキストベースファイルのみを提供できる場合(Jenkinsビルドの場合など)、この証明書はpemに変換できます:openssl x509 -inform DER -outform PEM -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem
Audrius Meskauskas 2017

4

私は同じ問題を抱えていました。少し掘り下げた後、多くのポスト/プレインストールスクリプトがさまざまな依存関係をインストールしようとし、特定のリポジトリが使用される場合があることに気付きました。より良い方法は、私のために働いたnodejsのhttpsモジュールの証明書チェックを無効にすることです。

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

この質問から


2
すでに述べたように、これはSSLの問題を修正するのではなく、通過するだけです。これに対処する適切な方法は、適切な署名証明書を信頼するように各パッケージ(git、npm、node)を適切に構成することです。あなたが企業の代理人の後ろにいるのなら、それは当然のことです。
アーロンC

0

問題はプロキシにあります。インストールパッケージのロケーションプロバイダーは独自の証明書を作成し、承認された機関から検証済みの証明書を購入しないため、プロキシはターゲットホストへのアクセスを許可しません。Chromeブラウザを使用するときはプロキシをバイパスすると思います。したがって、チェックはありません。

この問題にはいくつかの解決策があります。しかし、すべてはあなたがパッケージプロバイダーを信頼していることを意味します。

可能な解決策:

  1. 他の回答で述べたようにhttp://、プロキシをバイパスする可能性のあるアクセスを行うことができます。中間者がダウンロードにマルウェアを注入する可能性があるため、これは少し危険です。
  2. wgetあなたはフラグを使用することを示唆しています--no-check-certificate。これにより、リクエストにプロキシディレクティブが追加されます。プロキシは、ディレクティブを理解している場合、サーバー証明書が機関によって検証されているかどうかをチェックせず、要求を渡します。おそらく、wgetフラグと同じことを行うnpmの設定があります。
  3. CAnpmを受け入れるようにプロキシを設定します。私はあなたの代理人を知らないので、あなたにヒントを与えることはできません。


0

プロキシサーバーを制御できる場合、またはIT管理者を説得できる場合は、SSL検査からregistry.npmjs.orgを明示的に除外してみてください。これにより、プロキシサーバーのユーザーがstrict-sslチェックを無効にしたり、新しいルートCAをインストールしたりする必要がなくなります。


-1

これは、npmを回避し、ウィンドウマシンでyarnを使用するためにできることです。

yarn config set "strict-ssl" false
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.