使用npm时收到错误:“错误:SSL错误:SELF_SIGNED_CERT_IN_CHAIN”


292

我在ubuntu上使用npm v1.0.104 / node 0.6.12-我在尝试通过npm安装任何新模块时收到下面复制的错误(我之前使用http而不是https测试了socket.io,但我想知道是否可以导致npm / unsigned证书出现问题)。一旦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

1
不要删除严格的SSL。看看stackoverflow.com/a/16534065
nolim1t

15
自2014年2月27日起,npm不再支持其自签名证书。请参阅npm的博客文章或下面的最新答案以获取更多信息。
凯文·赖利2014年

1
如果你有这个在AWS弹性魔豆麻烦,一个解决方案,请访问:stackoverflow.com/questions/22096459/...
纪尧姆弗朗德勒

1
nolim1t:这不能解决问题的原因,而Kevin:博客文章中的命令不完整。有关适用于我的命令,请参见stackoverflow.com/a/22099006/106302
我们都是莫妮卡

1
@ali请更改“接受的答案”。由于npm升级而不是SSL问题,因此出现此问题。关闭SSL是错误的,特别是因为当前正确的响应是更新npm。凯文·赖利(Kevin Reilly)的答案应该是被接受的答案。谢谢。
Mikezx6r 2014年

Answers:


390

运行以下命令可以解决此问题:

npm config set strict-ssl false

我目前无法评论它是否会引起任何其他问题。希望能帮助到你。


39
而是运行“ npm config set ca null”,忽略ssl错误是一个坏主意
alex 2014年

6
@SnowInferno SSL还保证您正在与真正的Registry.npmjs.org进行交谈。有人可能会安装恶意软件包。
2014年

58
这是完全错误的。如果每次SSL都要关闭它,为什么还要使用SSL呢?“每当忽略错误会导致成功时,开发人员都会做到这一点。”
djechlin 2014年

20
请不要忽略ssl问题,因为存在错误的原因非常充分。此外,经过一番搜索,最终获得了以下鸣叫,该鸣叫链接到您的问题的正式解决方案(更新npm):twitter.com/npmjs/status/439279809307242496
Thomas Vervest 2014年

41
我的问题是由我背后的代理引起的,“ npm config set ca null”和“ npm config set ca“””仍然给我同样的错误,但是删除SSL效果很好。有时,良好的实践并不如实际有效。
Cory Schulz 2014年

220

自2014年2月27日起,npm不再支持其自签名证书根据npm的建议,以下选项是执行以下操作之一:

升级您的npm版本

npm install npm -g --ca=""

- 要么 -

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

npm config set ca ""

更新: 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

更新npm替代
方法解决基本问题的一种方法是使用已知的注册服务商,然后安装,然后停止使用已知的注册服务商。如jnylen所建议:

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

10
最简单的解决方案可能是下载最新版本的Node.js本身,其中包括可解决此问题的npm的新版本。上面的命令都不适合我。
Strille

1
我采用这种解决方案,因为它是第一个不忽略ssl的方法(通过在配置中将检查设置为false或使用http代替)。谢谢!
hcpl

12
npm install npm -g也给我错误SELF_SIGNED_CERT_IN_CHAIN
Anders Bornholm

3
如果这不起作用,npm config set ca ""请先执行,然后升级,然后撤消配置更改。请参阅:stackoverflow.com/a/22099006/106302
我们都是莫妮卡

1
@Redsandro sudo更改用户,-g标志设置为该用户全局安装还是仅本地安装node_modules
Radek

68

现在,我只是将注册表URL从https切换为http。像这样:

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

1
对我来说就像一个魅力。我不想丢失原始CA或强迫它忽略SSL错误。
SnowInferno 2014年

工作完美。谢谢!
穆罕默德·罗勒

13
禁用安全性不是解决方案!
亚历山德罗·佩扎托

1
我以前曾经使用过,但是由于某种原因,将其从“ http://”切换回“ https://”使我的工作再次进行。
kshreve 2015年

在尝试了所有其他解决方案之后,最终为我完成了这项工作:-)
Swapnil Kadu

49
npm config set strict-ssl false -g

全局保存


这样做给了我一个臭名昭著的cb() never called!npm错误
杰里米(Jeremy)

进行此设置后,我将在错误npm ERR下继续前进!代码E401 npm ERR!无法进行身份验证,需要:协商,NTLM npm ERR!可以在以下位置找到此运行的完整日志:npm ERR!C:\ BuildAgent \ npm-cache_logs \ 2019-06-24T10_23_46_563Z-debug.log
Shami Qureshi

31

您需要升级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


@奥利弗·萨尔茨堡:重新。您的编辑:在OS XI上根本sudo不需要,只在给upgrade命令加上前缀sudo对我来说很好。YMMV。
我们都是莫妮卡

啊,这对我有用。感谢您提供有关撤消配置更改的具体说明(因此我不必自己进行挖掘)!
马特

有趣。我只是在Debian服务器上测试了之后才进行编辑的。我喜欢当前的修订;)
Der Hochstapler 2014年

Ubuntu / Debian需要其他链接,请参阅下面的答案。
Redsandro 2014年

2
这应该是公认的解决方案。这不会禁用安全性,这是npm博客中描述的“官方”解决方案。
亚历山德罗·佩扎托

21

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

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

这可能与以下方面有关:

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

  • 具有透明代理的公司网络。

    如果您是企业Web代理的支持者,则应设置适当的HTTP_PROXY/ HTTPS_PROXY环境变量,或通过npm以下方式进行设置:

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

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

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

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

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

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

的Linux

根据建议,您可以将导出的证书添加到/etc/environment文件(Node 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中,您可以运行:

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错误


1
>如果是这种情况,则需要从链中导出自签名证书并将其导入系统,因此将其标记为受信任。-骗我
dmi3y

2
大!它还有助于将NODE_EXTRA_CA_CERTS = / etc / pki / ca-trust / source / anchors / yourCerts.pem添加到/ etc / environment中。节点7.4+考虑了这一点
ph4r05'9

9

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

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


1
对于Windows,请使用“设置NODE_TLS_REJECT_UNAUTHORIZED = 0”。然后就像一个魅力!
塔伦(Tarun)

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

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

资料来源:这最初是对jnylen答案的编辑。尽管指南中说“我们欢迎所有有建设性的修改,但请对其进行实质性修改”,但由于“该修改在原始帖子中的更改太大;该帖子的原始含义或意图会丢失” ,因此该编辑被拒绝我想社区更喜欢一个单独的答案。


这对我有用。但是,我不需要最后一个命令:sudo ln -s /usr/bin/nodejs /usr/bin/node
2014年

1
这可能取决于您是从官方Ubuntu存储库安装,从第三方存储库安装(对于较新版本)还是由您自己编译(对于最新版本)。
Redsandro 2014年

7

对于那些在Mac上存在相同问题并通过homebrew安装npm的用户:

brew uninstall npm

然后

brew install npm

在osx(10.9.1)上为我工作

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


4

快速干净的解决方案(已通过linux测试)(2014年2月27日生效)


卸载npm

npm rm npm -g

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

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

提示:如何在Linux中安装Node.js https://stackoverflow.com/a/22099363/333061


由于重定向301,该命令不再起作用,但是您仍然可以https://www.npmjs.org/install.sh在浏览器中键入并下载它,然后再手动运行它。
svassr 2014年


先前的curl https://npmjs.org/install.sh命令被重定向到https://www.npmjs.org/install.sh这就是为什么curl https://www.npmjs.org/install.sh | sh可以无缝运行的原因。可以从现在开始在小熊猫上安装。:)
Igor Parra


2

关闭SSL似乎是一个非常糟糕的主意。npm的博客解释说,他们不再支持其自签名证书。他们建议通过升级npm npm install npm -g,但我当然也遇到了同样的SELF_SIGNED_CERT_IN_CHAIN错误。因此,我只是更新了节点,它同时更新了npm。确切过程取决于首先安装节点的方式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.