npm安装错误 - 无法获得本地颁发者证书

min*_*rse 32 ssl node.js npm npm-install

unable to get local issuer certificate在执行npm安装时遇到错误:

typings ERR! message Unable to read typings for "es6-shim". You should check the
 entry paths in "es6-shim.d.ts" are up to date
typings ERR! caused by Unable to connect to "https://raw.githubusercontent.com/D
efinitelyTyped/DefinitelyTyped/7de6c3dd94feaeb21f20054b9f30d5dabc5efabd/es6-shim
/es6-shim.d.ts"
typings ERR! caused by unable to get local issuer certificate
Run Code Online (Sandbox Code Playgroud)

我最近从更早的版本更新到节点4,并且当出现这些问题时,听起来节点要严格得多.

有讨论的问题在这里它谈论使用CA文件,但它是一个有点超出我的理解,我不清楚该怎么办才好.

我在公司防火墙后面,但我可以在没有任何限制的情况下在浏览器中获得网址.

有没有人对此问题有任何进一步的了解以及有哪些可能的解决方案?

我想知道在此期间恢复到节点0.12 :(

小智 64

试试这个npm config set strict-ssl false.这是此网址https://github.com/nodejs/node/issues/3742中共享的替代方案

  • 限制strict-ssl是否安全? (7认同)
  • 我遇到了这个问题,这个答案没有帮助我,nfiles 的答案也没有帮助...... (7认同)
  • 安全吗?简短答案:否。很长答案,是的,但前提是您所在的安全网络中有为您执行SSL验证的代理服务器。与您的网络管理员联系。 (6认同)
  • 如果您使用的是纱线:`yarn config set "strict-ssl" false` (6认同)

Tim*_*m L 17

这里讨论的问题涉及使用ca文件,但它有点超出我的理解,我不确定如何处理它.

一旦你知道如何,这并不难!对于Windows:

使用Chrome转到根网址NPM抱怨(所以https://raw.githubusercontent.com在你的情况下).打开开发工具并转到Security-> View Certificate.检查认证路径并确保您获得顶级证书,如果没有打开那个证书.现在转到"详细信息"并使用"复制到文件..."导出证书.

您需要将其从DER转换为PEM.有几种方法可以做到这一点,但我找到的最简单的方法是使用相关关键字很容易找到的在线工具.

现在,如果您使用自己喜欢的文本编辑器打开密钥,您应该看到

-----BEGIN CERTIFICATE----- 

yourkey

-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

这是您需要的格式.您可以根据需要为多个键执行此操作,并将它们全部合并到一个文件中.我必须在我的情况下做github和npm注册表项.

现在只需编辑你的.npmrc指向包含你的密钥的文件就像这样

cafile=C:\workspace\rootCerts.crt
Run Code Online (Sandbox Code Playgroud)

我个人认为这比我们的公司代理更好地执行,而不是strict-ssl选项.因人而异.

  • 在 Windows 中,您可以直接将文件导出为 PEM——只需选择“Base64 Encoded X.509”版本而不是 DER 版本。此外,证书不包含您的密钥。相反,它包含 X.509 格式的证书。 (6认同)
  • @Neil,是的,它很安全,因为证书包含*公钥*。它不包含必须保密的私钥。 (4认同)
  • 最佳答案 IMO,因为它有效(对我而言)并且它不涉及绕过安全检查 (2认同)
  • 愚蠢的问题,使用在线工具转换我的证书安全吗? (2认同)
  • 如果您支持公司代理,这是一个非常合适的答案 (2认同)

Ken*_*Ken 15

这对我有用:

export NODE_TLS_REJECT_UNAUTHORIZED=0
Run Code Online (Sandbox Code Playgroud)

有关用法和警告,请参阅 NodeJS 文档:https : //nodejs.org/api/cli.html#cli_node_tls_reject_unauthorized_value

  • 如果有一些解释或文档参考,这个答案会更好。 (6认同)
  • 我仍然收到此警告消息。(节点:47985)警告:将 NODE_TLS_REJECT_UNAUTHORIZED 环境变量设置为“0”会禁用证书验证,从而导致 TLS 连接和 HTTPS 请求不安全。npm 错误!prepareGitDep 发出请求时出错。npm 错误!prepareGitDep 错误:SSL 错误:UNABLE_TO_GET_ISSUER_CERT_LOCALLY (2认同)

小智 13

可以使用配置~/.typingsrc文件配置类型.(~表示您的主目录)

发现在github上这个问题后:https://github.com/typings/typings/issues/120,我能够通过创建解决此问题破解~/.typingsrc,并设置该配置:

{
  "proxy": "http://<server>:<port>",
  "rejectUnauthorized": false
}
Run Code Online (Sandbox Code Playgroud)

它似乎也没有proxy设置工作,所以也许它能够从某个地方的环境中挑选出来.

这不是一个真正的解决方案,但足以typings忽略企业防火墙问题,以便我可以继续工作.我相信那里有更好的解决方案.


Nil*_*ils 13

当“npm install”尝试从带有自签名或无效证书的 HTTPS 服务器获取包时,任何人都会收到此错误。

快速且不安全的解决方案:

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

为什么这个解决方案不安全?上面的命令告诉 npm 连接并从服务器获取模块,即使服务器没有有效的证书并且服务器身份未被验证。因此,如果 npm 客户端和实际服务器之间存在代理服务器,则它为入侵者提供了中间人攻击机会。

安全解决方案:

如果 package.json 中的任何模块托管在具有自签名 CA 证书的服务器上,则 npm 无法使用可用的系统 CA 证书识别该服务器。因此,您需要使用 .npmrc 中的显式配置为服务器验证提供 CA 证书。在 .npmrc 中需要提供 cafile,详细请参考cafile 配置

cafile=./ca-certs.pem
Run Code Online (Sandbox Code Playgroud)

在 ca-certs 文件中,您可以添加识别服务器所需的任意数量的 CA 证书(公共)。证书应采用“Base-64 编码的 X.509 (.CER)(PEM)”格式。

例如,

# cat ca-certs.pem 
DigiCert Global Root CA
=======================
-----BEGIN CERTIFICATE-----
CAUw7C29C79Fv1C5qfPrmAE.....
-----END CERTIFICATE-----

VeriSign Class 3 Public Primary Certification Authority - G5
========================================
-----BEGIN CERTIFICATE-----
MIIE0zCCA7ugAwIBAgIQ......
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

注意:一旦您在 .npmrc 中提供 cafile 配置,npm 会尝试仅使用 cafile 中提供的 CA 证书来识别所有服务器,然后它不会检查系统 CA 证书包。这是一个著名的公共 CA 机构证书包

出现此错误时的另一种情况:

如果您在 package.json 中提到 Git URL 作为依赖项,并且 git 在无效/自签名证书上,那么 npm 也会抛出类似的错误。您可以使用 git 客户端的以下配置来修复它

git config --global http.sslVerify false 
Run Code Online (Sandbox Code Playgroud)

  • 如果系统位于公司/组织的安全代理后面,就会发生这种错误。因此,安全的解决方案应该始终是首选。只是为了给这个答案添加更多内容。以下命令可用于在 npmrc 文件中设置 cafile=./ca-certs.pem 。*设置 cafile:* `npm config set cafile &lt;CERT_FILE_PATH&gt;` *验证设置的 cafile:* `npm config get cafile` 有关如何设置配置的更多信息,请访问 https://docs.npmjs.com /misc/config#cafile 和 https://docs.npmjs.com/cli/config#set (2认同)

Eri*_*rik 10

我的问题是我的公司代理妨碍了我。这里的解决方案是识别我们代理的根 CA/证书链,(在 Mac 上)将其从钥匙串中以 .pem 格式导出,然后导出一个变量供节点使用。

export NODE_EXTRA_CA_CERTS=/path/to/your/CA/cert.pem
Run Code Online (Sandbox Code Playgroud)


m0n*_*awk 9

对于从 macOS 访问此内容的任何人:

不知何故,npm 没有找到正确的证书文件位置,我需要明确指向它:

$ echo "cafile=$(brew --prefix)/share/ca-certificates/cacert.pem" >> ~/.npmrc
$ cat ~/.npmrc # for ARM macOS
cafile=/opt/homebrew/share/ca-certificates/cacert.pem
Run Code Online (Sandbox Code Playgroud)


小智 7

此问题有不同的原因,解决方法也根据具体情况而有所不同。此处列出了一些解决方法(注意:这是不安全的解决方法,因此请在尝试之前检查您的组织策略)。

在此输入图像描述

第 1 步:使用命令提示符测试并确保计算机上的互联网正常工作,并且可以直接访问相同的 url,但 NPM 会失败。有很多工具可以实现此目的,例如curl、wget 等。如果您使用的是Windows,请尝试用于Windows 的telnet 或curl。

步骤 2:使用以下命令将 strict ssl 设置为 false

npm -g config set strict-ssl false

步骤 3:使用以下命令将拒绝未经授权的 TLS 设置为否:

export NODE_TLS_REJECT_UNAUTHORIZED=0

如果是 Windows(或者可以使用 screen 设置环境变量):

set NODE_TLS_REJECT_UNAUTHORIZED=0

步骤4:在安装命令中添加不安全参数,例如

npm i -g abc-package@1.0 --unsafe-perm true


Pra*_*uis 7

获得证书(cer 或 pem 文件)后,将其添加为系统变量,如下面的屏幕截图所示。

这是解决问题的安全方法,而不是禁用 SSL。在使用环境变量建立 SSL 连接时,您必须告诉 npm 或您正在使用的任何节点工具使用这些证书NODE_EXTRA_CA_CERTS

当您位于公司防火墙或代理后面时,这种情况很常见。您只需在使用公司的 VPN 或代理访问页面时检查 Chrome 中的安全选项卡,然后通过 Windows 中的“管理计算机证书”窗口导出证书,即可找到正确的证书。

在此输入图像描述


小智 6

只需使用命令提示符放置在注释下方。

其100%成功解决

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

  • 该解决方案可能不适用于企业防火墙后面的人员。 (3认同)
  • 有两件事情:1.这并非总是安全的解决方案,被认为是不正确的做法,并且2.这已经在先前的答案中进行了介绍。 (2认同)
  • 在公司防火墙后面为我工作 (2认同)

tjk*_*emz 5

如果您使用的是公司计算机,则它可能具有自定义证书(注意上面的复数)。花了一段时间才弄明白,但我一直在使用这个小脚本来获取所有内容并配置 Node、NPM、Yarn、AWS 和 Git(结果证明该解决方案与大多数工具类似)。这东西在你~/.bashrc~/.zshrc或类似地点:

function setup-certs() {
  # place to put the combined certs
  local cert_path="$HOME/.certs/all.pem"
  local cert_dir=$(dirname "${cert_path}")
  [[ -d "${cert_dir}" ]] || mkdir -p "${cert_dir}"
  # grab all the certs
  security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain > "${cert_path}"
  security find-certificate -a -p /Library/Keychains/System.keychain >> "${cert_path}"
  # configure env vars for commonly used tools
  export GIT_SSL_CAINFO="${cert_path}"
  export AWS_CA_BUNDLE="${cert_path}"
  export NODE_EXTRA_CA_CERTS="${cert_path}"
  # add the certs for npm and yarn
  # and since we have certs, strict-ssl can be true
  npm config set -g cafile "${cert_path}"
  npm config set -g strict-ssl true
  yarn config set cafile "${cert_path}" -g
  yarn config set strict-ssl true -g
}
setup-certs
Run Code Online (Sandbox Code Playgroud)

然后,您可以随时setup-certs在终端中运行。请注意,如果您使用 Nvm 来管理 Node 版本,则需要为每个版本的 Node 运行它。我注意到一些公司证书每隔一段时间就会轮换一次。只需重新运行即可setup-certs解决所有这些问题。

您会注意到大多数答案都建议设置strict-sslfalse. 请不要那样做。而是使用setup-certs解决方案来使用实际证书。

  • 您永远不应该将 strict-ssl 设置为 false。这是正确的答案。这也适用于 VPN。 (3认同)