在使用npm时收到错误:'错误:SSL错误:SELF_SIGNED_CERT_IN_CHAIN'

我在ubuntu上使用npm v1.0.104 / node 0.6.12 – 我试图通过npm安装任何新模块时收到下面的错误(我之前使用httptesting过socket.io,不是https,但是想知道是否可以导致与npm /未签名的证书的问题)。 一旦npm尝试parsing“https://registry.npmjs.org”url,就会popup错误消息。 有无论如何,我可以忽略错误,或者可能find/添加证书到可靠的商店,以继续使用npm。

任何需要做什么来解决这个问题的洞察力将不胜感激(我宁愿通过configuration解决问题,而不是如果可能重新安装)。

错误:“错误:SSL错误:SELF_SIGNED_CERT_IN_CHAIN”

完整的信息:

npm ERR! Error: SSL Error: SELF_SIGNED_CERT_IN_CHAIN npm ERR! at ClientRequest.<anonymous> (/usr/lib/node_modules/npm/node_modules/request/main.js:252:28) npm ERR! at ClientRequest.emit (events.js:67:17) npm ERR! at HTTPParser.onIncoming (http.js:1261:11) npm ERR! at HTTPParser.onHeadersComplete (http.js:102:31) npm ERR! at CleartextStream.ondata (http.js:1150:24) npm ERR! at CleartextStream._push (tls.js:375:27) npm ERR! at SecurePair.cycle (tls.js:734:20) npm ERR! at EncryptedStream.write (tls.js:130:13) npm ERR! at Socket.ondata (stream.js:38:26) npm ERR! at Socket.emit (events.js:67:17) npm ERR! Report this *entire* log at: npm ERR! <http://github.com/isaacs/npm/issues> npm ERR! or email it to: npm ERR! <npm-@googlegroups.com> npm ERR! npm ERR! System Linux 2.6.38-13-generic npm ERR! command "node" "/usr/bin/npm" "install" "jed" npm ERR! node -v v0.6.12 npm ERR! npm -v 1.0.104 

运行以下内容有助于解决问题:

 npm config set strict-ssl false 

我不能评论此时是否会引起其他问题。 希望它有帮助。

截至2014年2月27日, npm不再支持其自签名证书 。 按照npm的build议,以下选项是执行以下操作之一:

升级你的npm版本

 npm install npm -g --ca="" 

– 要么 –

告诉你当前版本的npm使用已知的注册商

 npm config set ca "" 

更新: npm发布了更多与SELF_SIGNED_CERT_IN_CHAIN和npm有关的更多帮助,针对不同的环境


您可能需要也可能不需要在build议中添加sudo


其他选项

看来人们用npm的build议有问题,所以这里有一些其他的潜在的解决scheme。

升级节点本身
接收到这个错误可能意味着你有一个旧版本的节点,它自然会附带一个老版本的npm。 一种解决scheme是升级您的节点版本。 这可能是最好的select,因为它为您带来了最新的并修复了现有的错误和漏洞。

这里的过程取决于你如何安装Node,你的操作系统,否则。

更新npm
因为你在试图install一个软件包的时候很可能到了这里,所以npm install npm -g可能会失败并且出现相同的错误。 如果是这种情况,请使用update 。 正如Nisanth Sojan所build议的那样:

 npm update npm -g 

更新npm的替代
解决问题的一个方法是使用已知的注册商,安装,然后停止使用已知的注册商。 正如jnylen所build议的那样:

 npm config set ca "" npm install npm -g npm config delete ca 

现在我只是将registryURL从https切换到http。 喜欢这个:

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

你需要升级npm。

 // Do this first, or the upgrade will fail npm config set ca "" npm install npm -g // Undo the previous config change npm config delete ca 

您可能需要使用sudo前缀这些命令。

资料来源: http : //blog.npmjs.org/post/78085451721/npms-self-signed-certificate-is-no-more

 npm config set strict-ssl false -g 

全球保存

存储库不再支持自签名证书。 你需要升级npm

 // Disable the certificate temporarily in order to do the upgrade npm config set ca "" // Upgrade npm. -g (global) means you need root permissions; be root // or prepend `sudo` sudo npm install npm -g // Undo the previous config change npm config delete ca // For Ubuntu/Debian-sid/Mint, node package is renamed to nodejs which // npm cannot find. Fix this: sudo ln -s /usr/bin/nodejs /usr/bin/node 

您需要打开一个新的terminal会话才能使用更新的npm

资料来源:这本来是对jnylen答案的编辑。 尽pipe准则中提到“我们欢迎所有build设性的修改,但是请让它们成为可观的”,但是编辑被拒绝了,原因是“这个编辑在原来的post中变化太大了,原本的意义或者意图将会丢失”。 我猜社区喜欢单独的答案。

对于那些在同一个问题的Mac ,并通过自制程序安装npm的人:

 brew uninstall npm 

然后

 brew install npm 

在OSX上为我工作(10.9.1)

编辑 :您可能需要在安装npm前brew update 。 更新自制软件后,您还可以进行brew upgrade 。 如果遇到任何其他问题,运行brew doctor可能会有所帮助。

错误SELF_SIGNED_CERT_IN_CHAIN意味着您在证书链中拥有基本上不被系统信任的自签名证书。

如果发生这种情况,基本上有些腥意,因此正如人们已经评论的那样,不build议只禁用证书检查,但更好的方法是了解问题的症结所在,并确定原因。

这可能涉及到:

  • 自定义存储库地址没有正确的证书,

  • 具有透明代理的公司networking。

    如果您位于公司Web代理之后,则应设置正确的HTTP_PROXY / HTTPS_PROXY环境variables或通过npm设置它们:

     npm config set proxy http://proxy.company.com:8080 npm config set https-proxy http://proxy.company.com:8080 

    请参阅: 如何在公司Web代理之后设置Node.js和Npm

如果您信任主机,则可以从链中导出自签名证书并将其导入系统,以便将其标记为可信。

这可以通过检查证书来实现(通过npm-debug.logexample.com变成npm repo,这是失败的):

 openssl s_client -showcerts -connect example.com:443 < /dev/null 

然后将证书内容(在BEGINEND之间)保存到.crt文件中以导入它。

Linux的

根据build议 ,您可以将导出的证书添加到/etc/environment文件(节点7.4+)中,如:

 NODE_EXTRA_CA_CERTS=/etc/pki/ca-trust/source/anchors/yourCer‌​ts.pem 

CentOS的

在CentOS 5上,这可以附加到/etc/pki/tls/certs/ca-bundle.crt文件中,例如

 ex +'g/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq | sudo tee -a /etc/pki/tls/certs/ca-bundle.crt sudo update-ca-trust force-enable sudo update-ca-trust extract npm install 

注意:要仅导出第一个证书,请在开头删除g

在CentOS 6中,证书文件可以复制到/etc/pki/ca-trust/source/anchors/

Ubuntu的/ Debian的

在Ubuntu / Debian中,将CRT文件复制到/usr/local/share/ca-certificates/然后运行:

 sudo update-ca-certificates 

MACOS

在macOS中,您可以运行:

 sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/foo.crt 

视窗

在Windows中: certutil -addstore -f "ROOT" new-root-certificate.crt


另请参阅: npm – 故障排除 – SSL错误

快速和干净的解决scheme(linuxtesting)(2014年2月27日之后)


卸载npm

 npm rm npm -g 

安装npm (新的URL是http://www.npmjs.org而不是npmjs.org

 curl https://www.npmjs.org/install.sh | sh 

提示 :如何在linux下安装node.js https://stackoverflow.com/a/22099363/333061

卸载NPM并重新安装。

截至2014年2月27日,npm不再支持其自签名证书。 http://blog.npmjs.org/post/78085451721/npms-self-signed-certificate-is-no-more

以上链接build议使用NPM升级NPM。 这也与SELF_SIGNED_CERT_IN_CHAIN失败…

closuresSSL似乎是一个非常糟糕的主意。 npm的博客解释说,他们不再支持他们的自签名证书。 他们build议通过npm install npm -g升级npm,但我当然得到了相同的SELF_SIGNED_CERT_IN_CHAIN错误。 所以我刚刚更新了节点,随之更新了npm。 确切的过程取决于你如何安装节点。