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

在Windows上运行Npm时如何修复SSL证书错误?,npm,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-

当我尝试用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)
然而,当我在我的网络浏览器(Google Chrome)中浏览到相同的URL时,它可以正常加载(见脚注)

怎么了


虽然我碰巧使用了https代理,但我相信这不是问题所在。我已经配置了环境变量
https\u proxy
(根据npm)。我知道环境变量是正确的,因为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.
我怎样才能解决这个问题?在不影响安全的情况下


我以前在我的web浏览器中也会出现SSL证书错误,直到我在控制面板的Internet选项中将“npmCA”证书安装为“受信任的根证书颁发机构”(屏幕截图)


编辑:我尝试了一种不安全的解决方法

但它仍然会以同样的错误超时

$ 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 config set proxy http://my-proxy.com:1080
npm config set https-proxy http://my-proxy.com:1080

另外,信息位于

此问题已通过使用http版本的存储库为我解决:

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

我也有同样的问题。经过一些挖掘,我意识到许多安装后/安装前脚本会尝试安装各种依赖项,有时会使用特定的存储库。更好的方法是禁用适用于我的NodeJ的https模块的证书检查

process.env.NODE\u TLS\u REJECT\u UNAUTHORIZED=“0”


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

替换现有证书

但是你得到了一个提示,表明你没有通过你的代理的身份验证。如果是代理上的基本身份验证,则需要将环境变量设置为以下形式:

http://user:pass@proxy.example.com:3128
可怕的NTLM 有一个HTTP状态码407(需要代理身份验证),这是表示拒绝您请求的是代理服务器而不是目标服务器的更正确方式。这段代码困扰了我很长时间,直到在谷歌上花了很多时间之后,我才知道我的代理被使用了。HTTP基本身份验证不足以满足我的公司霸主安装的任何代理。我求助于在本地机器上使用(未经验证),然后让它使用上游代理处理NTLM身份验证。然后,我不得不告诉所有无法执行NTLM的程序使用我的本地机器作为代理-这通常与设置
HTTP\u proxy
HTTPS\u proxy
一样简单。否则,对于npm使用(如@Agus建议):

“我们需要解密所有HTTPS流量,因为病毒” 在这个机构(笨拙地)运作了大约一年之后,公司的老板们决定更换代理。不仅如此,它将不再使用NTLM!一个勇敢的新世界。但是,由于那些恶意软件的作者现在通过HTTPS发送恶意软件,他们能够保护我们这些可怜的无辜用户的唯一方法就是在威胁到达我们之前,在每一个连接中间插入人,扫描威胁。正如你所能想象的,我被一种安全感征服了

长话短说,需要将自签名证书安装到npm中,以避免:

npm配置集cafile“”
或者,可以将
NODE\u EXTRA\u CA\u CERTS
环境变量设置为证书文件

我想这就是我所知道的让npm在代理/防火墙后工作的一切。希望有人觉得它有用

编辑:对于此问题,通常建议使用HTTP注册表或设置
NODE\u TLS\u REJECT\u UNAUTHORIZED
关闭HTTPS。这些都不是好主意,因为你正在向更多的中间人或重定向攻击敞开心扉。在安装包的机器上快速伪造DNS记录,您会发现自己在任何地方都信任包。让HTTPS正常工作似乎需要做很多工作,但强烈建议使用它。当你负责允许不受信任的代码进入公司时,你就会明白为什么

编辑2: 请记住,设置
npm config set cafile
会导致npm仅使用该文件中提供的证书,而不是使用该文件扩展现有的证书


如果您想使用环境变量
NODE\u EXTRA\u CA\u certs
扩展现有证书(例如,使用公司证书),则可以链接到该文件,并可以为您节省大量麻烦。请参见

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

这个问题有一些解决办法。但所有这些都意味着您信任包提供商

可能的解决办法:

  • 如其他答案中所述,您可以通过http://访问 可以绕过您的代理。这有点危险,因为中间的人可以把恶意软件注入你的下载。
  • wget
    建议您使用标志
    --无检查证书
    。这将向您的请求添加代理指令。如果代理理解该指令,则不会检查服务器证书是否由授权机构验证并通过请求。也许有一个配置与npm的作用与wget标志相同
  • 您将代理配置为接受CA npm。我不知道你的代理人,所以我不能给你一个暗示
    几天前,我碰巧遇到了类似的SSL问题。问题是您的npm没有设置根证书
    # Windows/MacOS/Linux 
    npm config set cafile "<path to your certificate file>"
    
    # Check the 'cafile'
    npm config get cafile
    
    http://proxy.example.com:3128
    
    http://user:pass@proxy.example.com:3128
    
    npm config set proxy http://proxy.example.com:3128
    npm config set https-proxy http://proxy.example.com:3128
    
    npm config set cafile "<path to certificate file>"
    
    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. 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 ---
    npm config set strict-ssl false
    
    yarn config set "strict-ssl" false