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

Col*_*nic 77 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)
Run Code Online (Sandbox Code Playgroud)

但是,当我在我的网络浏览器(谷歌浏览器)中浏览相同的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.
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?不损害安全性.


我曾经在我的网络浏览器中获得SSL证书错误,直到我在控制面板的Internet选项中将'npmCA'证书安装为'受信任的根证书颁发机构'(屏幕截图) 在此输入图像描述 )


编辑:我尝试了一个不安全的解决方法每https://npmjs.org/doc/config.html#strict-ssl

npm set strict-ssl false
Run Code Online (Sandbox Code Playgroud)

但它仍然会出现同样的错误

$ 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
Run Code Online (Sandbox Code Playgroud)

Ale*_*lor 124

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

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

#Check the 'cafile'
npm config get cafile
Run Code Online (Sandbox Code Playgroud)

全文

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

HTTP_PROXY和HTTPS_PROXY

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

http://proxy.example.com:3128
Run Code Online (Sandbox Code Playgroud)

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

http://user:pass@proxy.example.com:3128
Run Code Online (Sandbox Code Playgroud)

可怕的NTLM

有一个HTTP状态代码407(需要代理身份验证),这是更正确的方式来说它是代理而不是拒绝您的请求的目标服务器.这段代码困扰我的时间最长,直到在Google上花了很多时间后,我才知道我的代理使用了NTLM身份验证.HTTP基本身份验证不足以满足我的公司领导者安装的任何代理.我在我的本地机器上使用Cntlm(未经验证),然后让它使用上游代理处理NTLM身份验证.然后,我不得不告诉所有不能做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
Run Code Online (Sandbox Code Playgroud)

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

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

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

npm config set cafile "<path to certificate file>"
Run Code Online (Sandbox Code Playgroud)

我认为这就是让我知道如何让npm在代理/防火墙后面工作.愿有人发现它有用.

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

  • 在Windows上,我不得不使用正斜杠:npm config set cafile"C:/dev/Firefox/mycert.cer" (8认同)
  • 因为"正如你可以想象的那样,我被安全的感觉所克服." :) (6认同)
  • **没有等号`=``npm config set cafile"<证书文件的路径>"` (3认同)
  • 这是一个很棒的回复 - 我无法总结自己对代理+ zscalar更好的头痛 (2认同)
  • 如何获得证书文件? (2认同)

Ehs*_*san 40

使用http版本的存储库修复了这个问题:

npm config set registry http://registry.npmjs.org/
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常糟糕的解决方案! (45认同)
  • 这个答案是对的.在某些情况下,当你在公司代理混乱的情况下使用自己的证书链而在其他人之上并没有其他方法(除了完全禁用证书)之外(特别是当他们没有给你管理员权限时).这听起来像npm bug,它无法正确加载系统中的正确设置.但是为了交叉兼容性,他们不会修复npm,所以这是它的结果.那些说这是一个糟糕答案的人,他们不知道他们在谈论什么. (13认同)
  • @HaBo我猜他的意思是这是不安全的. (4认同)
  • @kenorb 不正确,您可以追溯代理执行的步骤,并使用 cafile 将这些自签名证书添加到您的链中。 (4认同)
  • @KiTO这是一个糟糕的解决方案,同意.但是,当我只想安装一些软件包时,为什么还要弄乱证书问题呢? (2认同)
  • 不仅糟糕,这可能是我见过的最被高估的答案.您可以通过进一步降低安全级别来解决安全问题.哇... (2认同)
  • @AlexTaylor我不是公司防火墙或代理的幕后黑手.我的观点是:这应该是开箱即用的,没有任何SSL-Cert配置. (2认同)

小智 8

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

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

从这个问题

  • 如前所述,这不会解决 SSL 问题,而只会绕过它。解决此问题的正确方法是正确配置每个包(git、npm、node)以信任正确的签名证书。当然,如果您是公司代理的背后。 (4认同)

Agu*_*gus 6

我有同样的问题,我克服了使用

npm config set proxy http://my-proxy.com:1080
npm config set https-proxy http://my-proxy.com:1080
Run Code Online (Sandbox Code Playgroud)

另外有关node-doc的信息


小智 6

几天前我碰巧遇到了类似的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程序.

您可以从以下位置下载根证书: 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. 该域名不会将根证书打包到他的证书中.

所以解决方案是明确设置根证书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根证书.


小智 5

npm config set strict-ssl false
Run Code Online (Sandbox Code Playgroud)

为我解决了这个问题。在这种情况下,我的代理和工件存储库都位于AWS云上的私有子网后面

  • 此解决方案将为所有安装关闭 ssl,这是一个安全风险。设置npm注册表是实际的解决方案npm config setregistry http://registry.npmjs.org/ (2认同)
  • 这在 Windows 10 中对我来说效果很好。快速修复。谢谢 (2认同)
  • @CodeMonkey这是命令“npm config setregistryregistry.npmjs.org” (2认同)