Nodejs npm install 出错,已经找到原因了,但不太理解
Nodejs npm install 出错,已经找到原因了,但不太理解
今天在ubuntu下用npm install一个工具,报了如下错误
Error: SSL Error: SELF_SIGNED_CERT_IN_CHAIN
在网上搜了下,已经找到了解释 Npm’s Self-Signed Certificate is No More。不过我不是太理解,希望各位大神能够解释一下,谢谢!
Nodejs npm install 出错,已经找到原因了,但不太理解
今天在 Ubuntu 下使用 npm install
安装一个工具时遇到了错误:
Error: SSL Error: SELF_SIGNED_CERT_IN_CHAIN
我在网上搜索了一些资料,并且找到了一些解释(Npm’s Self-Signed Certificate is No More)。然而,我对这个错误的细节仍然不是很理解。希望各位大神能帮我解释一下,谢谢!
错误解析
问题背景
当你尝试通过 npm install
下载依赖包时,npm 会从远程服务器下载这些包。为了确保下载过程的安全性,npm 使用了 HTTPS 协议来加密数据传输。HTTPS 需要一个受信任的证书颁发机构(CA)来验证服务器的身份。
错误原因
在某些情况下,例如在开发环境中或使用自签名证书时,服务器可能没有使用由受信任 CA 签发的证书。相反,它使用了一个自签名证书(self-signed certificate)。这种情况下,npm 无法验证服务器的身份,因此抛出了 SELF_SIGNED_CERT_IN_CHAIN
错误。
解决方案
-
更新 npm 和 node.js
首先,确保你的 npm 和 node.js 是最新版本,因为新版本可能已经修复了相关问题。
sudo npm install -g npm
-
禁用 SSL 验证
如果你只是临时需要解决这个问题,可以在安装时禁用 SSL 验证。但这不是推荐的做法,因为它降低了安全性。
npm config set strict-ssl false npm install
-
配置 npm 使用代理
如果你在公司网络中,可能会有代理服务器。你可以配置 npm 使用代理。
npm config set proxy http://your-proxy-url:port npm config set https-proxy http://your-proxy-url:port
-
添加自签名证书到信任列表
如果你确实需要使用自签名证书,可以将该证书添加到系统的信任列表中。具体步骤取决于你的操作系统。
- 在 Ubuntu 上,你可以将证书复制到
/usr/local/share/ca-certificates/
目录,并运行sudo update-ca-certificates
。
sudo cp your-self-signed-cert.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates
- 在 Ubuntu 上,你可以将证书复制到
希望这些解释对你有所帮助!如果你还有其他疑问,欢迎继续提问。
没有遇到过这个问题。简单查了一下:
As of February 27, 2014, npm no longer supports its self-signed certificates. 2014年2月27日,npm不再支持自签名证书。
The current stable version of node includes an npm client that is not affected by this issue. 当前Node的稳定版本包含的npm客户端不受影响。
所以,你使用的npm客户端使用了npm的自签名证书。 所以文章推荐的做法: 1). upgrade your version of npm 升级npm客户端, 升级的时候也不要使用自签名证书 npm install npm -g --ca=null 或 2). tell your current version of npm to use known registrars 如果你不打算升级npm客户端的话 npm config set ca=""
更多关于此问题的帮助: http://blog.npmjs.org/post/78165272245/more-help-with-self-signed-cert-in-chain-and-npm
赶脚是伟大的樯在召唤楼主:)
非常感谢!请问自签名证书是什么意思啊。。我只是顺带一问~我自己也会再查查的。。
对于你遇到的 Error: SSL Error: SELF_SIGNED_CERT_IN_CHAIN
错误,这是由于 Node.js 在执行 npm install
时,尝试连接到一个使用自签名证书的服务器,而该证书没有被信任的根证书颁发机构(CA)认证。
解释:
当 Node.js 尝试从网络下载包时,它会验证远程服务器的 SSL 证书。默认情况下,Node.js 使用操作系统的可信 CA 列表来验证这些证书。如果证书不是由这些受信任的 CA 颁发的,Node.js 就会拒绝连接并抛出错误。
在你的案例中,可能是 npm 的镜像源或某些依赖项的服务器使用了一个自签名的证书,而不是一个由受信任的 CA 签名的证书。
解决方法:
方法1:信任自签名证书
- 下载自签名证书:首先,你需要获取自签名证书。
- 安装证书:将该证书安装到你的操作系统信任的 CA 列表中。具体步骤取决于你的操作系统。
例如,在 Ubuntu 中,你可以将证书安装到 /usr/local/share/ca-certificates/
目录下,然后运行以下命令更新 CA 证书列表:
sudo update-ca-certificates
方法2:临时忽略证书验证
如果你只是想临时忽略证书验证问题,可以设置 npm 的环境变量 NODE_TLS_REJECT_UNAUTHORIZED
为 0
:
export NODE_TLS_REJECT_UNAUTHORIZED=0
但是这种方法存在安全风险,不建议在生产环境中使用。
示例代码:
通常情况下,无需修改代码来解决这个问题。重点在于正确配置系统级的信任证书或者修改 npm 的行为来接受自签名证书。
希望以上解释对你有所帮助!