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

ali*_*der 274 ssl-certificate node.js npm

我在ubuntu上使用npm v1.0.104/node 0.6.12 - 我在尝试通过npm安装任何新模块时收到下面复制的错误(我之前使用http测试了socket.io,而不是https但是我想知道是否可以导致npm/unsigned certs的问题).一旦npm尝试解析' https: //registry.npmjs.org'URL,该错误就会弹出.无论如何我可以忽略错误或者可能找到/添加证书到受信任的商店以继续使用npm.

任何有关解决问题需要做什么的见解都将受到赞赏(我希望通过配置来解决问题,而不是在可能的情况下重新安装).

错误:"错误: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
Run Code Online (Sandbox Code Playgroud)

ali*_*der 350

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

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

我不能评论它是否会在此时引起任何其他问题.希望能帮助到你.

  • 这是一个肮脏的错误.为什么你甚至打扰使用SSL,如果它每次做它应该做的一件事你关掉它?["任何时候忽略错误都会导致成功,开发人员会这样做."](http://hueniverse.com/2010/09/oauth-bearer-tokens-are-a-terrible-idea/) (55认同)
  • 我的问题是由我背后的代理引起的,"npm config set ca null"和'npm config set ca""'仍然给了我同样的错误,但删除SSL工作得很好.有时好的做法并不像实际工作那么重要. (39认同)
  • 运行"npm config set ca null"而忽略ssl错误是一个坏主意 (37认同)
  • 请不要忽视ssl问题,因为错误是有充分理由的.此外,一些搜索导致以下推文,链接到您的问题的官方解决方案(更新npm):https://twitter.com/npmjs/status/439279809307242496 (19认同)
  • 这个答案不应该被接受. (8认同)
  • @SnowInferno SSL还保证您正在与真实的registry.npmjs.org交谈.有人可能会安装恶意程序包. (6认同)
  • 将`npm config设置为strict-ssl true`撤消它吗? (4认同)
  • @djechlin - 非常真实。猜猜这是我的系统管理员为公司所做的权衡,因此他们可以更安全地了解每个人在 SSL 站点上所做的事情。 (3认同)
  • @SnowInferno他们的网站根本不需要被劫持,它可能是你的路由器/你的dns /服务器和服务器之间的任何东西.任何人都可以重定向流量并为您提供恶意程序包.我只是想说"将注册表网址从https更改为http应该没有负面影响"并不是真正的说法.我不是说忽略警告或覆盖CA是更好的选择.我最终更新了我的节点版本以解决问题. (2认同)
  • @djechlin - 邪恶?是的。有时,一种邪恶小于另一种。我的系统管理员对整个公司进行了“中间人批准”攻击。尽管有自签名证书,这让我可以使用 NPM。 (2认同)
  • +1,有效!如果您在拥有自己的链式证书的企业网络后面,则没有任何其他方法。一些公司通过 [Blue Coat](http://security.stackexchange.com/q/135378/11825) 强制自己加密,但同时迫使用户采取绝望的步骤并禁用 SSL 以安装所需的依赖项。 (2认同)
  • 我的客户做了一个中间人,提出了上述问题。我的解决方法是“ npm config set strict-ssl false”,然后执行nmp魔术,最后“ npm config set strict-ssl true”以再次设置记录。我不是我的首选解决方案,但会做出妥协。嗯...安全性已经受到威胁,因此在这种情况下可以很好地利用威胁。 (2认同)

Kev*_*lly 215

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

升级您的npm版本

npm install npm -g --ca=""
Run Code Online (Sandbox Code Playgroud)

- 要么 -

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

npm config set ca ""
Run Code Online (Sandbox Code Playgroud)

更新: npm已发布更多有关SELF_SIGNED_CERT_IN_CHAIN和npm的帮助以及针对不同环境的更多解决方案



您可能需要也可能不需要预先sudo建议.


其他选择

似乎人们在使用npm的建议时遇到问题,所以这里有一些其他潜在的解决方案.

升级节点本身
接收此错误可能表示您有一个较旧版本的节点,该节点自然带有较旧版本的npm.一种解决方案是升级您的Node版本.这可能是最佳选择,因为它可以为您提供最新信息并修复现有的错误和漏洞.

此过程取决于您如何安装Node,操作系统等.

更新npm
由于您可能在尝试install打包时遇到此问题,因此npm install npm -g可能会因同样的错误而失败.如果是这种情况,请update改用.正如Nisanth Sojan所说:

npm update npm -g
Run Code Online (Sandbox Code Playgroud)

更新npm替代
方法解决潜在问题的一种方法是使用已知的注册商,安装,然后停止使用已知的注册商.正如jnylen所说:

npm config set ca ""
npm install npm -g
npm config delete ca
Run Code Online (Sandbox Code Playgroud)

  • npm install npm -g也给了我错误SELF_SIGNED_CERT_IN_CHAIN (12认同)
  • 最简单的解决方案可能是下载最新版本的Nodejs,它包含一个新版本的npm,解决了这个问题.以上命令都不适合我. (10认同)
  • 更新npm使用"npm update npm -g" (8认同)
  • 如果这不起作用,请首先执行`npm config set ca"",然后升级,然后撤消配置更改.请参阅:http://stackoverflow.com/a/22099006/106302 (3认同)
  • 我使用这个解决方案,因为它是第一个不忽略 ssl 的解决方案(通过在配置中将检查设置为 false 或改用 http)。谢谢! (2认同)

小智 65

现在我只是将注册表URL从https切换到http.像这样:

npm config set registry="http://registry.npmjs.org/"
Run Code Online (Sandbox Code Playgroud)

  • 禁用安全性不是解决方案! (12认同)

Rob*_*bin 42

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

全局保存


jny*_*len 30

你需要升级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
Run Code Online (Sandbox Code Playgroud)

您可能需要为这些命令添加前缀sudo.

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

  • 这应该是公认的解决方案.这不会禁用安全性,是npm博客中描述的"官方"解决方案. (2认同)

ken*_*orb 15

该错误SELF_SIGNED_CERT_IN_CHAIN意味着您在证书链中具有自签名证书,该证书基本上不受系统信任.

如果发生这种情况,基本上会发生一些可疑的事情,因此正如人们已经评论过的那样,不建议只禁用证书检查,但更好的方法是了解问题所在并解决问题的原因.

这可能与以下内容有关:

如果您信任主机,则可以从链中导出自签名证书并将其导入系统,因此它们被标记为受信任.

这可以通过检查证书来实现(根据情况更改example.com为失败的npm repo npm-debug.log):

openssl s_client -showcerts -connect example.com:443 < /dev/null
Run Code Online (Sandbox Code Playgroud)

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

Linux的

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

NODE_EXTRA_CA_CERTS=/etc/pki/ca-trust/source/anchors/yourCer??ts.pem
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

Ubuntu的/ Debian的

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

sudo update-ca-certificates
Run Code Online (Sandbox Code Playgroud)

苹果系统

在macOS中,您可以运行:

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/foo.crt
Run Code Online (Sandbox Code Playgroud)

视窗

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


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

  • &gt; 如果是这种情况,您需要从链中导出自签名证书并将其导入系统,以便将它们标记为受信任。- 给我诡计。 (2认同)
  • 大!它还有助于将NODE_EXTRA_CA_CERTS = / etc / pki / ca-trust / source / anchors / yourCerts.pem添加到/ etc / environment。节点7.4+考虑了这一点 (2认同)
  • 这是这里唯一正确的答案。剩下的只是一个不安全的解决方法...... (2认同)

Red*_*dro 8

存储库不再支持自签名证书.你需要升级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
Run Code Online (Sandbox Code Playgroud)

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

资料来源:这本来是对jnylen答案的编辑.虽然指南说"我们欢迎所有建设性的编辑,但请使它们具有实质性的编辑",但由于"此编辑在原始帖子中发生了太大变化,该帖子的原始含义或意图将丢失",编辑被拒绝了.我想社区更喜欢单独的答案.


小智 8

只适合windows下开发

$Env:NODE_TLS_REJECT_UNAUTHORIZED=0 
Run Code Online (Sandbox Code Playgroud)


Pat*_*ick 7

对于那些在Mac上遇到相同问题并通过自制软件安装npm的人:

brew uninstall npm
Run Code Online (Sandbox Code Playgroud)

然后

brew install npm
Run Code Online (Sandbox Code Playgroud)

在osx上为我工作(10.9.1)

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


Ada*_*ane 7

将其放在命令之前似乎可行NODE_TLS_REJECT_UNAUTHORIZED=0。例如:NODE_TLS_REJECT_UNAUTHORIZED=0 npm ...

最好弄清楚如何使节点将自签名证书视为有效。出于某些原因,上面的strict-ssl建议对我不起作用。如果您了解安全隐患并且需要临时快速修复,这就是我在Google搜索错误期间的一些随机github问题中发现的内容。

  • 对于 Windows,请使用“设置 NODE_TLS_REJECT_UNAUTHORIZED=0”。然后就像一个魅力! (3认同)

小智 7

我创建了一篇文章,介绍如何在没有选择的情况下禁用公司防火墙后面的大多数 npm 问题。

请注意,您可能容易受到攻击。

https://wnderlvst.com/stories/102a237a-cea1-463b-89db-82224f1c1cbe

电源外壳

yarn config set "strict-ssl" false
yarn config set "network-timeout" 600000
$env:NODE_TLS_REJECT_UNAUTHORIZED=0
Run Code Online (Sandbox Code Playgroud)