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

npm install error - unable to get local issuer certificate

我在执行 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

我最近从更早的版本更新到 node 4,当出现这类问题时,听起来 node 更加严格。

讨论了一个问题 here,它讨论了使用 ca 文件,但它有点超出我的理解范围,我不确定该怎么做。

我在公司防火墙后面,但我可以在浏览器中不受任何限制地访问 url。

有没有人对这个问题有更深入的了解以及有哪些可能的解决方案?

我想知道同时恢复到节点 0.12 :(

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

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

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

它似乎在没有 proxy 设置的情况下也能正常工作,所以也许它能够从某个地方的环境中获取它。

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

免责声明:此解决方案不太安全,是不好的做法,请勿这样做。 我有一条重复的错误消息——我支持一家公司 VPN/firewall。我能够通过将 .typingsrc 文件添加到我的用户目录(windows 中的 C:\Users\MyUserName\.typingsrc)来解决此问题。当然,无论何时你要绕过 SSL,你都应该向你的系统管理员大喊大叫以解决证书问题。

将注册表 URL 从 https 更改为 http,如上文 所示,设置rejectUnauthorizedfalse

.typingsrc(放在项目目录或用户根目录)

{
     "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 令牌的说明

There is an issue discussed here which talks about using ca files, but it's a bit beyond my understanding and I'm unsure what to do about it.

一旦你知道怎么做,这并不难!对于 Windows:

使用 Chrome 转到根 URL NPM 正在抱怨(所以 https://raw.githubusercontent.com 在你的情况下)。 打开开发工具并转到安全-> 查看证书。检查证书路径并确保您的顶级证书,如果没有打开那个证书。现在转到 "Details" 并使用 "Copy to File...".

导出证书

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

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

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

yourkey

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

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

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

cafile=C:\workspace\rootCerts.crt

我个人发现与 strict-ssl 选项相比,它在我们的公司代理后面表现得更好。 YMMV.

尝试

npm config set strict-ssl false

这是在此 url https://github.com/nodejs/node/issues/3742

中分享的备选方案

嗯,这不是一个正确的答案,但可以被视为一种快速解决方法。正确答案是关闭严格 SSL。

我遇到了同样的错误

在 PATH 中找不到 PhantomJS
正在下载 https://github.com/Medium/phantomjs/releases/download/v2.1.1/phantomjs-2.1.1-windows.zip
保存到 C:\Users\Sam\AppData\Local\Temp\phantomjs\phantomjs-2.1.1-windows.zip
正在接收...

提出请求时出错。
错误:无法获取本地颁发者证书
在 TLSSocket。 (_tls_wrap.js:1105:38)
在 emitNone (events.js:106:13)
在 TLSSocket.emit (events.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"]

来源:

当 'npm install' 尝试使用自签名证书或无效证书从 HTTPS 服务器获取包时,任何人都会遇到此错误。

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

npm config set strict-ssl false

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

安全解决方案:

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

cafile=./ca-certs.pem

在 ca-certs 文件中,您可以添加任意数量的 CA 证书 (public),以识别服务器。证书应采用“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-----

注意:一旦您在 .npmrc 中提供了 cafile 配置,npm 将尝试仅使用 cafile 中提供的 CA 证书来识别所有服务器,然后它不会检查系统 CA 证书包。 这是一个众所周知的 public CA authority certificate bundle.

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

如果您在 package.json 中提到 Git URL 作为依赖项并且 git 在 invalid/self-signed 证书上,那么 npm 也会抛出类似的错误。 您可以使用 git 客户端

的以下配置来修复它
git config --global http.sslVerify false 

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

npm config set strict-ssl false

深入挖掘后,我发现这个 link 被我们的 IT 管理员阻止了。

http://registry.npmjs.org/npm

因此,如果您遇到同样的问题,请先确保您的浏览器可以访问此 link。

如果您使用 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 版本 运行 执行此操作。我注意到一些公司证书经常轮换。只需重新 运行ning setup-certs 即可解决所有问题。

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

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

第 1 步:测试并确保 Internet 在具有命令提示符的计算机上正常工作,并且相同的 url 可直接访问,但 NPM 失败。有很多工具可以做到这一点,例如 curl、wget 等。如果您使用的是 windows,请尝试使用 telnet 或 curl for windows。

第 2 步:使用以下命令将严格的 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

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

这是解决问题的安全方法,而不是禁用 SSL。在使用环境变量 NODE_EXTRA_CA_CERTS.

建立 SSL 连接时,您必须告诉 npm 或您正在使用的任何节点工具使用这些证书

当您处于公司防火墙或代理之后时,这很常见。在您公司的 VPN 或代理上访问页面时,只需检查 Chrome 中的安全选项卡,然后通过 [=20= 中的“管理计算机证书”window 导出证书,即可找到正确的证书].