将根CA添加到npm

94

我正在寻找一种方法将自定义CA添加到NPM,以便我可以使用该证书从某个位置下载(一个内部git服务器),而不必使用“nuke all CA-checking”(指关闭所有CA检查)。

npm config set strict-ssl false

有没有办法实现这个功能?如果没有,是否已经存在缺陷?

2个回答

159
你可以将npm指向cafile
npm config set cafile /path/to/cert.pem

您还可以直接配置ca字符串。

npm config set ca "cert string"

ca 也可以是证书字符串的数组。在您的 .npmrc 文件中:

ca[]="cert 1 base64 string"
ca[]="cert 2 base64 string"

npm config 命令将相关配置项保存到您的 ~/.npmrc 文件中:

cafile=/path/to/cert.pem
注意:这些 CA 设置将覆盖 npm 使用的默认“真实世界”证书颁发机构查找。如果您尝试通过未由您的 CA 证书签名的 https 访问任何公共 npm 注册表,则会出现错误。 因此,如果您需要同时支持公共 https npm 注册表和自己的注册表,您可以使用 基于 Mozilla 的 curl CA 捆绑包 并将您的 CA 证书附加到 cacert.pem 文件中:
curl -o ~/.npm.certs.pem https://curl.se/ca/cacert.pem
cat my-ca-cert.pem >> ~/.npm.certs.pem
npm config set cafile ~/.npm.certs.pem

很遗憾,npm的CA证书包无法编辑,因为它是在源代码中提供的(感谢tomekwi)。但是nitzel提供了一种通用的Node.js方法,可以通过NODE_EXTRA_CA_CERTS环境变量添加证书。

RHEL注意事项:如果您使用基于RHEL的发行版并且使用RHEL打包的nodejs/npm,则可以使用标准的update-ca-trust方法,因为RedHat将其软件包指向系统CA证书。


3
Node.js本身并没有预装证书,但是在源代码中有一个证书列表:https://github.com/joyent/node/blob/master/src/node_root_certs.h - tomekwi
4
基于 Github 的 URL 已经过时。新的 URL 现在是:https://curl.haxx.se/ca/cacert.pem - JE42
7
尝试运行命令NODE_DEBUG=tls,https,http npm -ddd command,检查你的HTTP连接是否设置了CA,并查看TLS握手的过程。 - Matt
1
@Matt 我正在使用 Java%jdk%/%jre%/lib/security 中的 cacerts。在 .npmrc 中显示了正确的路径。但仍然出现错误,关于 npm ERR! fatal: unable to access <URL>: SSL certificate problem: unable to get local issuer certificate。你有什么想法如何解决吗? - Jimit Patel
1
@JimitPatel Java有自己的证书密钥库格式。这些证书需要使用keytool进行导出,才能在Java之外的环境中使用。 - Matt
显示剩余2条评论

42
如果Matts Answer没有帮助到您,以下的Windows PowerShell方法对我有用,类似的CMD / Unix方法适用于其他用户:
Windows Powershell
$env:NODE_EXTRA_CA_CERTS=path\to\certificate.pem; npm install

DOS / Windows cmd

(由评论中的Marc指出)

set NODE_EXTRA_CA_CERTS=C:\\path\\to\\certificate.pem
npm install

Linux / Unix / Mac OS

(由Mikemread1208在评论中指出)

export NODE_EXTRA_CA_CERTS=/path/to/trusted/CA.pem
npm install

1
你如何指定带有驱动器的Windows路径?在Linux中,/path/to 只适用于Linux... - Marc
2
明白了:在DOS中设置NODE_EXTRA_CA_CERTS=C:\bcp\cafile.pem - Marc
2
@Marc PowerShell接受/\(并使用\来转义字符,而不是\)。在markdown中转义\\真是太困难了。._. - nitzel
7
我有疑问,难道这个答案不比被采纳的答案更好吗?我不想“覆盖”默认设置,而且原问题似乎也没有这个要求。我只想在信任商店中添加一个证书(我们公司的MITM证书)。 - DavidS
4
在 Linux / Unix / OSX 中:export NODE_EXTRA_CA_CERTS=/path/to/trusted/CA.pem来源 - Mike Pennington
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接