我在 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
运行以下命令有助于解决问题:
npm config set strict-ssl false
我目前无法评论它是否会导致任何其他问题。
截至 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
npm config set ca ""
,然后升级,然后撤消配置更改。请参阅:stackoverflow.com/a/22099006/106302
sudo
更改用户,-g
标志设置是为该用户全局安装还是仅在本地安装 node_modules
。
现在我只是将注册表 URL 从 https 切换到 http。像这样:
npm config set registry="http://registry.npmjs.org/"
npm config set strict-ssl false -g
全局保存
cb() never called!
npm 错误
错误 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
然后将证书内容(在 BEGIN
和 END
之间)保存到 .crt
文件中以便导入。
Linux
根据 suggestion,您可以将以下内容添加到 /etc/environment
文件(节点 7.4+)以导出您的 CA 链,例如:
NODE_EXTRA_CA_CERTS=/etc/pki/ca-trust/source/anchors/yourCerts.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
export NODE_EXTRA_CA_CERTS=/path-to-cert/yourCerts.pem
您需要升级 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
sudo
,并且只在升级命令前加上 sudo
对我来说效果很好。 YMMV。
将它放在命令之前似乎有效NODE_TLS_REJECT_UNAUTHORIZED=0
。例如:NODE_TLS_REJECT_UNAUTHORIZED=0 npm ...
最好弄清楚如何让节点将自签名证书视为有效。由于某种原因,上面的 strict-ssl 建议对我不起作用。如果您了解安全隐患并需要临时快速修复,这就是我在 Google 搜索错误期间在某些 random github issues 中发现的内容。
Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification.
存储库不再支持自签名证书。您需要升级 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
。
对于那些在 Mac 上遇到同样问题并通过自制软件安装 npm 的人:
brew uninstall npm
然后
brew install npm
在 osx (10.9.1) 上为我工作
编辑:您可能需要在安装 npm 之前brew update
。您也可以在更新自制软件后执行 brew upgrade
。如果您遇到任何其他问题,运行 brew doctor
也可能会有所帮助。
只是为了在windows中开发
$Env:NODE_TLS_REJECT_UNAUTHORIZED=0
快速干净的解决方案(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
https://www.npmjs.org/install.sh
并在手动运行之前下载它。
curl https://npmjs.org/install.sh
命令重定向到 https://www.npmjs.org/install.sh
,这就是 curl https://www.npmjs.org/install.sh | sh
无缝运行的原因。从现在开始可以在 little padawan 上安装。 :)
我已经创建了一篇文章如何在您没有选择的情况下禁用公司防火墙后面的大多数 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
卸载 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 失败...
关闭 SSL 似乎是一个非常糟糕的主意。 npm's blog 解释说他们不再支持自签名证书。他们建议通过 npm install npm -g
升级 npm,但我当然遇到了相同的 SELF_SIGNED_CERT_IN_CHAIN 错误。所以我刚刚更新了节点,它也随之更新了 npm。确切的过程取决于您首先安装节点的方式。
您将需要找到您公司的代理详细信息以及您应该使用的 npm 注册表。之后,您可以在位于用户文件夹 C:/users/
这就是它可以指定的方式 -
registry=https://your_company/npm/registry/
proxy=http://username:password@proxy:port/
https-proxy=http://username:password@proxy:port/
密码是纯文本的,这显然不理想可能有一种方法可以以 npm 理解的方式对其进行加密。
由于公司代理,我遇到了相同的 SSL 自签名证书错误。我在安装 node-gyp 时遇到问题。我尝试先卸载 Angular/cli 并安装 node-gyp 然后尝试重新安装 Angular cli
npm uninstall -g @angular/cli
npm install -g node-gyp
npm install -g @angular/cli
它工作得很好
对我来说,这是一个超级简单的解决方案。我需要做的就是通过 npm config set https-proxy "http://proxyserverurl:port"
在 npm 中设置 https-proxy。 @somshivam 的解决方案也有效,但如果您要通过 Azure DevOps 等云管道安装模块,则不能在 npmrc 文件中设置代理,否则它将失败。