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

时间:2016-04-08 07:52:06

标签: node.js ssl npm npm-install

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

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

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

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

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

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

15 个答案:

答案 0 :(得分:45)

试试这个npm config set strict-ssl false。这是此网址https://github.com/nodejs/node/issues/3742

中的另一种选择

答案 1 :(得分:10)

  

这里讨论的问题涉及使用ca文件,但它有点超出我的理解,我不确定该怎么办。

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

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

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

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

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

yourkey

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

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

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

cafile=C:\workspace\rootCerts.crt

我个人认为,这与我们的公司代理相比,与strict-ssl选项相比,表现明显更好。 YMMV。

答案 2 :(得分:9)

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

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

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

它似乎也可以在没有proxy设置的情况下工作,所以也许它可以从某个地方的环境中选择它。

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

答案 3 :(得分:7)

这对我有用:

export NODE_TLS_REJECT_UNAUTHORIZED=0

答案 4 :(得分:4)

如果您使用的是公司计算机,则它可能具有自定义证书(注意上面的复数)。花了一段时间才弄明白,但我一直在使用这个小脚本来获取所有内容并配置 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 解决方案来使用实际证书。

答案 5 :(得分:3)

只需在命令提示符下放在注释的下方即可。

其100%成功解决

-npm config set strict-ssl false

答案 6 :(得分:2)

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

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

npm config set strict-ssl false

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

安全的解决方案:

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

的更多详细信息
cafile=./ca-certs.pem

在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-----

注意:在.npmrc中提供cafile配置后,npm会尝试仅使用cafile中提供的CA证书来识别所有服务器,然后它将不检查系统CA证书包。 如果某人想要所有知名的公共CA权威证书包,则可以从here获取。

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

如果您在package.json中提到Git URL作为依赖项,并且git在无效/自签名证书上,那么npm也会引发类似错误。 您可以使用git client的以下配置对其进行修复

git config --global http.sslVerify false 

答案 7 :(得分:2)

如果您使用 yarn

yarn config set strict-ssl false

答案 8 :(得分:1)

免责声明:此解决方案不太安全,不好做,不要这样做。 我有一个重复的错误消息 - 我在企业VPN /防火墙后面。我能够通过将.typingsrc文件添加到我的用户目录(Windows中的C:\Users\MyUserName\.typingsrc)来解决此问题。当然,无论何时你绕过SSL,都应该与你的系统管理员交换以解决证书问题。

将注册表网址从 https 更改为 http ,如上面nfiles' answser所示,将 rejectUnauthorized 设置为

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

答案 9 :(得分:1)

这不是一个正确的答案,但是可以考虑作为一种快速的解决方法。正确的答案是关闭严格的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                                    

答案 10 :(得分:1)

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

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

答案 11 :(得分:0)

添加:

process.env["NODE_TLS_REJECT_UNAUTHORIZED"]

来源:Ignore invalid self-signed ssl certificate in node.js with https.request?

答案 12 :(得分:0)

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

npm config set strict-ssl false

深入研究后,我发现此链接被我们的IT管理员阻止了。

http://registry.npmjs.org/npm

因此,如果您遇到相同的问题,请确保您的浏览器首先可以访问此链接。

答案 13 :(得分:0)

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

enter image description here

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

第 2 步:使用以下命令将严格的 ssl 设置为 false

npm -g config set strict-ssl false

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

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

答案 14 :(得分:-1)

set NODE_TLS_REJECT_UNAUTHORIZED=0