【问题标题】:How to fix SSL certificate error when running Npm on Windows?在 Windows 上运行 Npm 时如何修复 SSL 证书错误?
【发布时间】:2012-12-04 12:51:47
【问题描述】:

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

但是,当我在我的网络浏览器(谷歌浏览器)中浏览到相同的 URL 时,它可以正常加载(见脚注)。 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 选项中将“npmCA”证书安装为“受信任的根证书颁发机构”(屏幕截图)


编辑:我根据https://npmjs.org/doc/config.html#strict-ssl 尝试了 insecure 解决方法

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

【问题讨论】:

标签: npm


【解决方案1】:

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"&lt;path to certificate file&gt;"

全文

我不得不在 Windows 下的公司防火墙后面使用 npm、pip、ma​​ven 等 - 这并不好玩。我会尽量让这个平台不可知/感知。

HTTP_PROXY & HTTPS_PROXY

HTTP_PROXYHTTPS_PROXY 是许多软件用来了解代理位置的环境变量。在 Windows 下,许多软件还使用您的操作系统指定的代理,这是完全不同的事情。这意味着您可以让 Chrome(它使用您的 Internet 选项中指定的代理)很好地连接到 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 authentication。 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

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

在这种设置已经(笨拙地)嗡嗡作响大约一年之后,公司霸主决定更换代理。不仅如此,它还将不再使用 NTLM!可以肯定的是一个勇敢的新世界。但是由于这些恶意软件的编写者现在通过 HTTPS 传递恶意软件,他们保护我们这些可怜的无辜用户的唯一方法就是在每个连接到达我们之前就对每个连接进行中间人扫描以查找威胁。正如你可以想象的那样,我被安全感所征服。

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

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

或者,可以将NODE_EXTRA_CA_CERTS 环境变量设置为证书文件。

我认为这就是我所知道的关于让 npm 在代理/防火墙后面工作的一切。愿有人觉得它有用。

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

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

如果您想使用环境变量 NODE_EXTRA_CA_CERTS 来扩展现有证书(例如,使用公司证书)链接到文件,这是一种可行的方法,可以为您节省很多麻烦。见how-to-add-custom-certificate-authority-ca-to-nodejs

【讨论】:

  • 在 Windows 上,我必须使用正斜杠:npm config set cafile "C:/dev/Firefox/mycert.cer"
  • ** 不带等号 = npm config set cafile "&lt;path to your certificate file&gt;"
  • 这是一个很棒的回应——我无法更好地总结我自己对代理 + zscalar 的头痛
  • 笑得很厉害,因为“你可以想象,我被安全感征服了。” :)
  • 如何获取证书文件?
【解决方案2】:

使用 http 版本的存储库为我解决了这个问题:

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

【讨论】:

  • 这是一个非常糟糕的解决方案!
  • @HaBo 我猜他的意思是这是不安全的。
  • @KiTO 这是一个糟糕的解决方案,同意。但是,当我只想安装一些软件包时,为什么还要处理证书问题呢?
  • 这个答案是正确的。在某些情况下,当您落后于公司代理,将自己的证书链置于其他人之上,并且没有其他方法(除了完全禁用证书之外)(尤其是当他们没有授予您管理员权限时)。这听起来像 npm 错误,它没有从系统正确加载正确的设置。但是为了交叉兼容,他们不会修复npm,所以这是它的结果。说这是一个糟糕的答案的人,他们不知道他们在说什么。
  • @kenorb 不正确,您可以追溯代理采取的步骤,并使用 cafile 将这些自签名证书添加到您的链中。
【解决方案3】:
npm config set strict-ssl false

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

【讨论】:

  • 此解决方案将为所有安装设置 ssl,这是一个安全风险。设置 npm 注册表是实际的解决方案 npm config set registry registry.npmjs.org
  • 这在 Windows 10 中对我来说很好用。快速修复。谢谢
【解决方案4】:

几天前我碰巧遇到了类似的 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 问题。你的 sn-p 说:

错误:无法验证 registry.npmjs.org 的证书, 由 /C=US/ST=CA/L=Oakland/O=npm/OU=npm 发布 证书颁发机构/CN=npmCA/emailAddress=i@izs.me: 无法在本地验证颁发者的权限。

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

  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=加利福尼亚/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 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根证书。

【讨论】:

  • 如果您只能提供文本基础文件(如 Jenkins 构建),此证书可以转换为 pem:openssl x509 -inform DER -outform PEM -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem
【解决方案5】:

我遇到了同样的问题,我用

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

更多信息node-doc

【讨论】:

    【解决方案6】:

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

    process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

    From this question

    【讨论】:

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

    问题出在您的代理上。因为您的安装包的位置提供者会创建自己的证书,并且不会从公认的权威机构购买经过验证的证书,所以您的代理不允许访问目标主机。 我假设您在使用 Chrome 浏览器时绕过代理。所以没有检查。

    这个问题有一些解决方案。但这一切都意味着您信任软件包提供者。

    可能的解决方案:

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

    【讨论】:

      【解决方案8】:

      您需要将证书 .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

      【讨论】:

        【解决方案9】:

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

        yarn config set "strict-ssl" false
        

        【讨论】:

          【解决方案10】:

          如果您可以控制代理服务器或者可以说服您的 IT 管理员,您可以尝试从 SSL 检查中明确排除 registry.npmjs.org。这应该可以避免代理服务器的用户必须禁用严格的 SSL 检查或安装新的根 CA。

          【讨论】:

            猜你喜欢
            • 2022-06-13
            • 2017-12-11
            • 1970-01-01
            • 2012-03-02
            • 2019-06-21
            • 1970-01-01
            • 2019-07-03
            • 2022-06-22
            • 2019-10-27
            相关资源
            最近更新 更多