如何在Windows上运行Npm时修复SSL证书错误?

时间:2012-12-17 12:12:14

标签: npm

当我尝试使用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)

但是,当我在网络浏览器(谷歌浏览器)中浏览相同的网址时,它会正常加载(请参阅脚注)。 https://registry.npmjs.org/coffee-script

出了什么问题?


虽然我碰巧使用https代理,但我确信这不是问题所在。我已经配置了环境变量https_proxy(根据npm user guide)。我知道环境变量是正确的,因为Python包管理器pip正确地跟随它。

我认为问题与SSL证书有关,因为如果我用wget下载该URL,我会收到有关证书的明确错误

$ 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.

我该如何解决这个问题?不损害安全性。


我曾经在我的网络浏览器中获取SSL证书错误,直到我在控制面板的Internet选项(截屏enter image description here)中将'npmCA'证书安装为'受信任的根证书颁发机构'


编辑:我按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

10 个答案:

答案 0 :(得分:109)

TL; DR - 只需运行此操作,不要禁用您的安全性:

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

#Check the 'cafile'
npm config get cafile

全文

我必须在Windows下的公司防火墙后面使用npm,pip,maven等 - 这并不好玩。我会尽可能地保持这个平台不可知/意识到。

HTTP_PROXY&amp; HTTPS_PROXY

HTTP_PROXY&amp; HTTPS_PROXY是许多软件使用的环境变量,用于了解代理的位置。在Windows下,许多软件也使用您的操作系统指定代理,这是完全不同的事情。这意味着你可以让Chrome(它使用你的Internet选项中指定的代理)连接到URL就好了,但是npm,pip,maven等没有用,因为他们使用HTTPS_PROXY(除非他们使用HTTP_PROXY - 见后面)。通常,环境变量看起来像:

http://proxy.example.com:3128

但是你得到一个403,表示你没有针对你的代理进行身份验证。如果它是代理上的基本身份验证,则您需要将环境变量设置为以下形式:

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

可怕的NTLM

有一个HTTP状态代码407(需要代理身份验证),这是更正确的方式,它说它是代理而不是拒绝您的请求的目标服务器。这段代码困扰我的时间最长,直到在Google上花了很多时间后,我才知道我的代理使用了NTLM authentication。 HTTP基本身份验证不足以满足我的公司领导者安装的任何代理。我在本地计算机(未经身份验证)上使用Cntlm,然后让它使用上游代理处理NTLM身份验证。然后我必须告诉所有无法使用我的本地计算机作为代理的程序 - 这通常就像设置HTTP_PROXYHTTPS_PROXY一样简单。否则,对于npm使用(如@Agus建议的那样):

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

“我们需要解密所有HTTPS流量,因为病毒”

此设置一直哼着(笨拙地)大约一年之后,公司领主决定改变代理。不仅如此,它还不再使用NTLM了!一个勇敢的新世界可以肯定。但是因为那些恶意软件的编写者现在通过HTTPS提供恶意软件,他们保护我们可怜的无辜用户的唯一方法是在他们甚至到达我们之前扫描威胁的每个连接都是中间人。你可以想象,我被安全感所克服。

简而言之,需要将自签名证书安装到npm以避免SELF_SIGNED_CERT_IN_CHAIN

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

我认为这就是我所知道的让npm在代理/防火墙后面工作的一切。可能有人发现它很有用。

编辑:通过使用HTTP注册表或设置NODE_TLS_REJECT_UNAUTHORIZED来解决此问题的HTTPS是一个非常常见的建议。这些都不是好主意,因为你正在进行进一步的中间人或重定向攻击。在执行软件包安装的机器上快速欺骗您的DNS记录,您会发现自己信任任何地方的软件包。使HTTPS工作看起来似乎很多,但强烈建议。当您负责允许不受信任的代码进入公司时,您就会理解为什么。

答案 1 :(得分:38)

使用http版本的存储库来修复此问题:

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

答案 2 :(得分:6)

我遇到了同样的问题,我克服了

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

另请参阅node-doc

答案 3 :(得分:5)

几天前我碰巧遇到了类似的SSL问题。问题是你的npm没有为https://registry.npmjs.org使用的证书设置根证书。

<强>解决方案:

  1. 使用wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crt修复wget问题
  2. 使用npm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crt为您的npm程序设置根证书。
  3. 您可以从https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt

    下载根证书

    注意:不同的程序可能会使用不同的管理根证书的方式,所以不要将浏览器与其他人混合使用。

    分析:

    让我们先解决您的wget https://registry.npmjs.org/coffee-script问题。你的片段说:

    
            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.
    
    

    这意味着您的wget程序无法验证https://registry.npmjs.org的证书。导致此问题的原因有两个:

    1. 您的wget程序没有此域的根证书。根证书通常附带系统。
    2. 该域名不会将根证书打包到他的证书中。
    3. 因此解决方案明确为https://registry.npmjs.org设置了根证书。我们可以使用openssl来确保下面的原因是问题。

      在命令行上尝试:openssl s_client -host registry.npmjs.org -port 443,我们将收到此消息(前几行):

      
          CONNECTED(00000003)
          depth=1 /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance CA-3
          verify error:num=20:unable to get local issuer certificate
          verify return:0
          ---
          Certificate chain
           0 s:/C=US/ST=California/L=San Francisco/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 s:/C=US/O=DigiCert Inc/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不打包根证书。所以我们谷歌DigiCert High Assurance EV Root CA根证书。

答案 4 :(得分:3)

我遇到了同样的问题。经过一番挖掘后,我意识到许多发布/预安装脚本会尝试安装各种依赖项,有时会使用特定的存储库。更好的方法是为我工作的nodejs禁用https模块的证书检查。

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

From this question

答案 5 :(得分:1)

npm config set strict-ssl false 为我解决了这个问题。 在这种情况下,我的代理人和工件存放处都位于AWS云上的私有子网后面

答案 6 :(得分:0)

问题出在您的代理上。由于安装包的位置提供程序创建了自己的证书,并且未从接受的权限中购买经过验证的证书,因此您的代理不允许访问目标主机。 我假设您在使用Chrome浏览器时绕过代理。所以没有检查。

这个问题有一些解决方案。但都暗示您信任包裹提供商。

可能的解决方案:

  1. 如其他答案所述,您可以http://访问哪个 可以绕过您的代理。这有点危险,因为中间人可以向你下载恶意软件。
  2. wget建议您使用标记--no-check-certificate。这将为您的请求添加代理指令。如果代理了解该指令,则不检查服务器证书是否由权威机构验证并传递该请求。也许有一个使用npm的配置与wget标志相同。
  3. 您将代理配置为接受CA npm。我不知道你的代理人,所以我不能给你一个提示。

答案 7 :(得分:0)

设置以下属性:

“ npm config set strict-ssl false”

答案 8 :(得分:0)

这是避免npm并在开窗机中使用纱线的方法。

yarn config set "strict-ssl" false

答案 9 :(得分:0)

如果您可以控制代理服务器,或者可以说服IT管理员,则可以尝试从SSL检查中显式排除Registry.npmjs.org。这样可以避免代理服务器的用户不必禁用strict-ssl检查或安装新的根CA。