108

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
4

10 に答える 10

188

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は、ファイルにリンクする方法であり、多くの手間を省くことができます。how-to-add-custom-certificate-authority-ca-to-nodejsを参照してください

于 2015-05-20T05:58:43.877 に答える
34

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

npm config set registry http://registry.npmjs.org/
于 2013-11-30T20:47:40.363 に答える
22
npm config set strict-ssl false

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

于 2019-02-05T15:45:15.710 に答える
8

数日前に、この同様の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)
    深さ=1/ C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
    エラーを確認してください:num = 20:ローカル発行者証明書を取得できません
    リターンの確認:0
    ---
    証明書チェーン
     0秒:/C=US/ST=カリフォルニア/L=サンフランシスコ/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つまり、GoogleDigiCert High Assurance EV Root CAのルート証明書です。

于 2015-05-20T12:12:37.060 に答える
7

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

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

さらにnode-docの情報

于 2013-05-13T17:13:26.737 に答える
5

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

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

この質問から

于 2015-02-18T14:52:02.140 に答える
0

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

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

可能な解決策:

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

証明書.cerを.pemに変換する必要があります。CMDで実行する場合:

openssl x509 -inform der -in C:\ tmp \ zScaler.cer -out C:\ tmp \ zScaler.pem

npm config set cafile C:\ tmp \ zScaler.pem

于 2021-12-29T22:53:30.353 に答える
-1

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

yarn config set "strict-ssl" false
于 2020-08-27T08:34:15.837 に答える
-1

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

于 2020-09-28T07:09:11.567 に答える