ChatGPT解决这个技术问题 Extra ChatGPT

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

我在 ubuntu 上使用 npm v1.0.104/node 0.6.12 - 我在尝试通过 npm 安装任何新模块时收到下面复制的错误(我之前使用 http 而不是 https 测试了 socket.io,但我想知道是否这样可能导致 npm/未签名证书出现问题)。一旦 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
不要删除严格的 SSL。看看stackoverflow.com/a/16534065
自 2014 年 2 月 27 日起,npm 不再支持其自签名证书。有关详细信息,请参阅 npm's blog post 或下面的最新答案。
如果您在 AWS Elastic Beanstalk 上遇到此问题,可在此处找到解决方案:stackoverflow.com/questions/22096459/…
nolim1t:这并没有解决问题的原因,并且 Kevin:博客文章中的命令不完整。有关对我有用的命令,请参阅 stackoverflow.com/a/22099006/106302
@ali 请更改“已接受的答案”此问题是由于 npm 升级而出现的,而不是 SSL 的问题。关闭 SSL 是不好的,特别是因为当前正确的响应是更新 npm。 Kevin Reilly 的答案应该是已接受的答案。谢谢你。

J
Jean-François Fabre

运行以下命令有助于解决问题:

npm config set strict-ssl false

我目前无法评论它是否会导致任何其他问题。


改为运行“npm config set ca null”,忽略 ssl 错误是个坏主意
@SnowInferno SSL 还保证您正在与真正的 registry.npmjs.org 交谈。有人可能会安装恶意软件包。
这是大错特错。如果每次 SSL 都做它应该做的一件事,你为什么还要费心使用它? "Any time ignoring an error leads to success, developers are going to do just that."
请不要忽略 ssl 问题,因为该错误是有充分理由的。此外,经过一番搜索,我们得到了以下推文,其中链接到您的问题的官方解决方案(更新 npm):twitter.com/npmjs/status/439279809307242496
我的问题是由我落后的代理引起的,“npm config set ca null”和“npm config set ca””仍然给了我同样的错误,但删除 SSL 效果很好。有时,好的做法并不像实际有效的那样重要。
K
Kevin Reilly

截至 2014 年 2 月 27 日,npm no longer supports its self-signed certificates npm 推荐的以下选项是执行以下操作之一:

升级你的 npm 版本

npm install npm -g --ca=""

- 或者 -

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

npm config set ca ""

更新: npm 发布了More help with SELF_SIGNED_CERT_IN_CHAIN and npm,其中包含针对不同环境的更多解决方案

须藤

其他选项

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

升级节点本身 收到此错误可能表明您拥有旧版本的节点,它自然带有旧版本的 npm。一种解决方案是升级您的 Node.js 版本。这可能是最好的选择,因为它可以让您了解最新信息并修复现有的错误和漏洞。

此处的过程取决于您如何安装 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

最简单的解决方案可能是下载最新版本的 Nodejs 本身,它包含一个新版本的 npm 来解决这个问题。上面的命令都不适合我。
我选择了这个解决方案,因为它是第一个不忽略 ssl 的解决方案(通过在配置中将检查设置为 false 或改用 http)。谢谢!
npm install npm -g 也给了我错误 SELF_SIGNED_CERT_IN_CHAIN
如果这不起作用,请先执行 npm config set ca "",然后升级,然后撤消配置更改。请参阅:stackoverflow.com/a/22099006/106302
@Redsandro sudo 更改用户,-g 标志设置是为该用户全局安装还是仅在本地安装 node_modules
H
Hermann

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

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

对我来说就像一个魅力。我不想丢失原始 CA 或强制它忽略 SSL 错误。
工作完美。谢谢!
禁用安全性不能成为解决方案!
我以前使用过这个,但由于某种原因,将它从“http://”切换回“https://”让我的工作再次开始。
在尝试了所有其他解决方案之后,这终于为我工作了:-)
A
Andy
npm config set strict-ssl false -g

全局保存


这样做会给我臭名昭著的 cb() never called! npm 错误
在此设置之后,我遇到错误 npm ERR!代码 E401 npm 错误!无法验证,需要:协商,NTLM npm ERR!可以在以下位置找到此运行的完整日志:npm ERR! C:\BuildAgent\npm-cache_logs\2019-06-24T10_23_46_563Z-debug.log
E
Elijah Lynn

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

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

这可能与以下任一有关:

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

具有透明代理的企业网络。如果您使用公司网络代理,则应设置适当的 HTTP_PROXY/HTTPS_PROXY 环境变量或通过 npm 设置它们: npm config set proxy http://proxy.company.com:8080 npm config set https-proxy http ://proxy.company.com:8080 请参阅:如何在企业网络代理后面设置 Node.js 和 Npm

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

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

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

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

Linux

根据 suggestion,您可以将以下内容添加到 /etc/environment 文件(节点 7.4+)以导出您的 CA 链,例如:

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

中央操作系统

在 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 - Troubleshooting - SSL Error


> 如果是这种情况,您需要从链中导出自签名证书并将其导入系统,因此它们被标记为受信任。 - 对我来说是个把戏。
伟大的!它还有助于将 NODE_EXTRA_CA_CERTS=/etc/pki/ca-trust/source/anchors/yourCerts.pem 添加到 /etc/environment。 Node 7.4+ 考虑到了这一点
这是这里唯一正确的答案。其余的只是一个不安全的解决方法......
@ph4r05 我在 Mac 上对 ~/.zshrc 做了同样的事情:export NODE_EXTRA_CA_CERTS=/path-to-cert/yourCerts.pem
W
We Are All Monica

您需要升级 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,并且只在升级命令前加上 sudo 对我来说效果很好。 YMMV。
啊,这对我有用。感谢您提供有关撤消配置更改的具体说明(所以我不必自己挖掘它)!
有趣的。我只是在 Debian 服务器上测试后才进行编辑。不过我喜欢当前的版本;)
Ubuntu/Debian 需要额外的链接,请参阅下面的答案。
这应该是公认的解决方案。这不会禁用安全性,并且是 npm 博客中描述的“官方”解决方案。
A
Adam Lane

将它放在命令之前似乎有效NODE_TLS_REJECT_UNAUTHORIZED=0。例如:NODE_TLS_REJECT_UNAUTHORIZED=0 npm ...

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


对于 Windows,使用“设置 NODE_TLS_REJECT_UNAUTHORIZED=0”。然后像魅力一样工作!
它有效:) Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification.
R
Redsandro

存储库不再支持自签名证书。您需要升级 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
这可能取决于您是从官方 Ubuntu 存储库、第三方存储库(对于较新版本)还是自己编译(对于最新版本)安装的。
P
Patrick

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

brew uninstall npm

然后

brew install npm

在 osx (10.9.1) 上为我工作

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


我们可以在窗口上安装 brew 吗?
j
jiz

只是为了在windows中开发

$Env:NODE_TLS_REJECT_UNAUTHORIZED=0 

只是一个小细节 - 这是一个从 Powershell 控制台运行的脚本。然后在同一个 PowerShell 窗口中运行“npm i”。
C
Community

快速干净的解决方案(Linux 测试)(fatidic 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 并在手动运行之前下载它。
或使用 -L flag 运行 curl
之前的 curl https://npmjs.org/install.sh 命令重定向到 https://www.npmjs.org/install.sh,这就是 curl https://www.npmjs.org/install.sh | sh 无缝运行的原因。从现在开始可以在 little padawan 上安装。 :)
T
TheDomis4

我已经创建了一篇文章如何在您没有选择的情况下禁用公司防火墙后面的大多数 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

F
Florian Winter

卸载 NPM 并重新安装。

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

上面的链接建议使用 NPM 升级 NPM。这也因 SELF_SIGNED_CERT_IN_CHAIN 失败...


J
Jeremiah Orr

关闭 SSL 似乎是一个非常糟糕的主意。 npm's blog 解释说他们不再支持自签名证书。他们建议通过 npm install npm -g 升级 npm,但我当然遇到了相同的 SELF_SIGNED_CERT_IN_CHAIN 错误。所以我刚刚更新了节点,它也随之更新了 npm。确切的过程取决于您首先安装节点的方式。


s
somshivam

您将需要找到您公司的代理详细信息以及您应该使用的 npm 注册表。之后,您可以在位于用户文件夹 C:/users/ 下的 .npmrc 文件中指定相同的内容。

这就是它可以指定的方式 -

registry=https://your_company/npm/registry/
proxy=http://username:password@proxy:port/
https-proxy=http://username:password@proxy:port/

密码是纯文本的,这显然不理想可能有一种方法可以以 npm 理解的方式对其进行加密。


S
Sreekanth Kategaru

由于公司代理,我遇到了相同的 SSL 自签名证书错误。我在安装 node-gyp 时遇到问题。我尝试先卸载 Angular/cli 并安装 node-gyp 然后尝试重新安装 Angular cli

npm uninstall -g @angular/cli
npm install -g node-gyp
npm install -g @angular/cli

它工作得很好


b
billoverton

对我来说,这是一个超级简单的解决方案。我需要做的就是通过 npm config set https-proxy "http://proxyserverurl:port" 在 npm 中设置 https-proxy。 @somshivam 的解决方案也有效,但如果您要通过 Azure DevOps 等云管道安装模块,则不能在 npmrc 文件中设置代理,否则它将失败。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅