错误:SSL错误:SELF_SIGNED_CERT_IN_CHAIN'在使用NPM时

我在ubuntu上使用npm v1.0.104/node 0.6.12 -当我试图通过npm安装任何新模块时,我收到了下面的错误。IO之前使用http,而不是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
478000 次浏览

执行以下命令帮助解决该问题:

npm config set strict-ssl false

目前我还不能评论它是否会引起任何其他问题。

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

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

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

升级你的npm版本

npm install npm -g --ca=""

——或——

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

npm config set ca ""

更新: npm发布了更多关于SELF_SIGNED_CERT_IN_CHAIN和npm的帮助,提供了更多针对不同环境的解决方案

< p > < br >
你可能需要也可能不需要在建议前加上sudo


其他选项

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

< p > 升级节点本身 < br > 收到这个错误可能表明你有一个较旧版本的node,这自然是一个较旧版本的npm。一个解决方案是升级您的Node版本。这可能是最好的选择,因为它能让你更新并修复现有的错误和漏洞

这里的过程取决于您如何安装Node、操作系统等。

< p > 更新npm < br > 因为你可能是在尝试install一个包时到达这里的,所以npm install npm -g可能会失败并出现相同的错误。如果是这种情况,请改用update。正如Nisanth Sojan所建议的:

npm update npm -g
< p > 更新npm替代方案 < br > 解决潜在问题的一种方法是使用已知的注册器,安装,然后停止使用已知的注册器。由jnylen建议:

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

卸载NPM并重新安装。

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

上面的链接建议使用NPM升级NPM。对于SELF_SIGNED_CERT_IN_CHAIN…

关闭SSL似乎是一个非常糟糕的主意。npm的博客解释说他们不再支持他们的自签名证书。他们建议通过npm install npm -g升级npm,但我当然得到了同样的SELF_SIGNED_CERT_IN_CHAIN错误。我更新了node, npm也随之更新了。具体的过程取决于您最初是如何安装节点的。

快速干净的解决方案(linux测试)(2014年2月27日fatidic之后)


卸载npm

npm rm npm -g

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

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

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

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

// 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的答案的编辑。虽然指导方针说“我们欢迎所有建设性的编辑,但请让它们具有实质性,”编辑被拒绝由于“这个编辑对原始帖子的修改太多了;帖子的原意或意图就会丧失。”,我猜社区更喜欢一个单独的答案。

对于那些在mac上有相同问题并通过家酿安装npm的人:

brew uninstall npm

然后

brew install npm

适用于osx (10.9.1)

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

npm config set strict-ssl false -g

在全球范围内保存

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
    

    看:如何设置Node.js和Npm背后的企业web代理

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

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

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

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

Linux

根据建议,你可以在/etc/environment文件(Node 7.4+)中添加以下内容来导出你的CA链,比如:

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

把这个放在命令之前似乎可以工作NODE_TLS_REJECT_UNAUTHORIZED=0。 例:NODE_TLS_REJECT_UNAUTHORIZED=0 npm ... < / p >

最好弄清楚如何使节点将自签名证书视为有效的。由于某些原因,上面的严格ssl建议对我不起作用。如果你理解安全影响并需要临时快速修复,这是我在谷歌搜索错误期间在一些随机github问题中发现的。

只是为了在Windows中开发

$Env:NODE_TLS_REJECT_UNAUTHORIZED=0

我写了一篇文章,如果你别无选择,如何在公司防火墙后禁用大多数npm问题。

要注意你可能容易受到攻击。

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

Powershell

yarn config set "strict-ssl" false
yarn config set "network-timeout" 600000
$env:NODE_TLS_REJECT_UNAUTHORIZED=0

我有相同的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注册表。 之后,您可以在用户文件夹C:/users/<your_user>下的.npmrc文件中指定相同的参数

这就是它如何被指定的

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

密码是纯文本的,这显然不理想,也许有一种方法可以用npm理解的方式加密它。

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