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

在执行 npm 安装时,我得到了一个 unable to get local issuer certificate错误:

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

我最近从一个更早的版本更新到了 Node4,当出现这类问题时,Node4似乎要严格得多。

有一个问题讨论 给你,其中谈到使用 ca 文件,但它有点超出了我的理解,我不知道该怎么办。

我在公司防火墙后面,但是我可以在浏览器中访问网址,没有任何限制。

有没有人对这个问题有进一步的了解,有什么可能的解决办法?

与此同时,我想恢复到节点0.12: (

287576 次浏览

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

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

{
"proxy": "http://<server>:<port>",
"rejectUnauthorized": false
}

它似乎也不需要 proxy设置就能工作,所以也许它可以从环境的某个地方获得这些信息。

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

免责声明: 这个解决方案不太安全,不好的做法,不要这样做。 我收到了一条重复的错误信息,我在公司的 VPN/防火墙后面。我可以通过添加一个。输入 src 文件到我的用户目录(窗口中的 C:\Users\MyUserName\.typingsrc)。当然,在规避 SSL 的任何时候,您都应该对系统管理员大声疾呼,以修复证书问题。

将注册表 URL 从 Https更改为 译注:,如上面的 Nfiles 的答案所示,将 拒绝未经授权设置为 假的

. typeingsrc (放在 project 目录或用户根目录中)

{
"rejectUnauthorized": false,
"registryURL": "http://api.typings.org/"
}

可选地添加您的 github 令牌(在添加这个令牌之前,我没有找到成功的方法。)

{
"rejectUnauthorized": false,
"registryURL": "http://api.typings.org/",
"githubToken": "YourGitHubToken"
}

请参阅在 https://github.com/blog/1509-personal-api-tokens上设置 github 令牌的说明

这里讨论了一个关于使用 ca 文件的问题,但是这有点超出了我的理解范围,我不知道该怎么做。

一旦你知道怎么做就不会太难了! 对于 Windows:

使用 Chrome 访问 NPM 正在抱怨的根 URL (所以在您的案例中是 https://raw.githubusercontent.com)。 打开开发工具,转到 Security-> View Securities。检查认证路径,并确保您的顶级证书,如果没有打开该证书。现在转到“ Details”,并用“ Copy to File...”导出证书。

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

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

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


yourkey


-----END CERTIFICATE-----

这就是您需要的格式。您可以根据需要对任意多个键执行此操作,并将它们组合成一个文件。在我的案例中,我必须使用 github 和 npm 注册表项。

现在只需编辑.npmrc 指向包含密钥的文件,如下所示

cafile=C:\workspace\rootCerts.crt

我个人发现,与严格的 ssl 选项相比,我们的公司代理在这方面的表现要好得多。

试试看

npm config set strict-ssl false

这是在这个网址 https://github.com/nodejs/node/issues/3742中共享的一个替代方案

这不是一个正确的答案,但可以考虑作为一个快速的解决办法。正确的答案是关闭严格的 SSL。

我也犯了同样的错误

PATH 上找不到 PhantomJS
下载 < a href = “ https://github.com/Medium/phantomjs/release/download/v2.1.1/phantomjs-2.1.1-windows.zip”rel = “ nofollow norefrer”> https://github.com/medium/phantomjs/releases/download/v2.1.1/phantomjs-2.1.1-windows.zip
保存到 C: 用户 Sam AppData Local Temp phantomjs phantomjs-2.1.1-windows. zip
收到..。

提出请求时出错。
错误: 无法获得本地颁发者证书
在 TLSSocket (_ tls _ wrap.js: 1105:38)
At emitNone (events s.js: 106:13)
在 TLSSocket.umi (events s.js: 208:7)
在 TLSSocket. _ finishInit (_ tls _ wrap.js: 639:8)
在 TLSWrap.ssl.onhandshakedone (_ tls _ wrap.js: 469:38)

所以在读取错误之后。

只需手动下载文件并将其放置在所需的路径上。 也就是说

C:\Users\Sam\AppData\Local\Temp\phantomjs\

这解决了我的问题。

    PhantomJS not found on PATH
Download already available at C:\Users\sam\AppData\Local\Temp\phantomjs\phantomjs-2.1.1-windows.zip
Verified checksum of previously downloaded file
Extracting zip contents

地址:

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

资料来源: 忽略带 https.request 的 node.js 中无效的自签名 ssl 证书?

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

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

npm config set strict-ssl false

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

安全的解决方案:

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

cafile=./ca-certs.pem

在 CA-certs 文件中,可以添加标识服务器所需的任意数量的 CA 证书(公共)。证书应该在“ Base-64编码的 X.509(。(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-----

注意: 一旦您在。Npmrc,npm 尝试使用文件中提供的 CA 证书来识别所有服务器,这样就不会检查系统 CA 证书包。 这是著名的 公共 CA 授权证书包

当您得到这个错误时,还有一种情况:

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

git config --global http.sslVerify false

我也遇到过同样的问题,这个命令对我也不起作用:

npm config set strict-ssl false

在深入挖掘之后,我发现这个链接被我们的 IT 管理员屏蔽了。

http://registry.npmjs.org/npm

因此,如果您面临同样的问题,请确保您的浏览器可以首先访问这个链接。

如果你使用 yarn:

yarn config set strict-ssl false

这对我很有效:

export NODE_TLS_REJECT_UNAUTHORIZED=0

有关使用和警告,请参考 NodeJS 文档: Https://nodejs.org/api/cli.html#cli_node_tls_reject_unauthorized_value

我的问题是我的公司代理人挡了我的道。这里的解决方案是识别我们代理的根 CA/证书链,(在 mac 上)将其从密钥链导出到。Pem 格式,然后导出一个变量供节点使用。

export NODE_EXTRA_CA_CERTS=/path/to/your/CA/cert.pem

如果您使用的是公司计算机,那么它很可能有自定义证书(请注意上面的复数形式)。虽然花了一些时间才弄明白,但是我一直在使用这个小脚本获取所有内容并配置 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

然后,您可以在任何时候在您的终端中运行 setup-certs。请注意,如果使用 Nvm 管理 Node 版本,则需要对每个 Node 版本运行此命令。我注意到有些公司的证书经常轮换。只需重新运行 setup-certs即可解决所有这些问题。

您会注意到,大多数答案建议将 strict-ssl设置为 false。别这样。而是使用 setup-certs解决方案来使用实际的证书。

出现这个问题的原因不同,解决办法也因情况而异。这里列出了一些解决方案(注意: 这是不安全的解决方案,所以请在尝试之前检查您的组织策略)。

enter image description here

步骤1: 使用命令提示符测试并确保 Internet 在机器上正常工作,并且 NPM 无法直接访问相同的 URL。有很多工具可以做到这一点,比如 curl、 wget 等等。如果您正在使用窗口,那么尝试 telnet 或 curl 作为窗口。

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

npm -g config set strict-ssl false

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

export NODE_TLS_REJECT_UNAUTHORIZED=0

在视窗下(或可使用屏幕设定环境变量) :

set NODE_TLS_REJECT_UNAUTHORIZED=0

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

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

一旦您有了您的证书(cerer 或 pem 文件) ,将其添加为系统变量,如下面的截图所示。

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

这种情况在企业防火墙或代理服务器后面很常见。当你访问你公司的 VPN 或代理服务器上的网页时,只需检查 Chrome 中的安全标签,然后通过 Windows 中的“管理计算机证书”窗口导出证书,你就可以找到正确的证书。

enter image description here

对于任何从 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