我有公司管理的私人 npm 注册表(在 nexus 中),并通过 ssl 证书进行保护。我可以通过浏览器访问它,也可以使用带有我个人证书的curl来访问它。
例如,这是有效的,我可以获取包内容,所以我想我的证书没问题:
curl -vvv https://example.com/repository/group/example-package --cert my.crt --key my.key
但是当我使用
npm i
时,我以错误结束
npm i example-package --registry https://example.com/repository/group/ --certfile=my.crt --keyfile=my.key --verbose --strict-ssl=true
errno UNABLE_TO_GET_ISSUER_CERT_LOCALLY
这是一个非常著名的错误,大多数答案是将 strict-ssl 设置为 false,但通过这个选项我得到了。
npm http fetch GET 401 https://example.com/repository/group/example-package 318ms (cache skip)
...
npm ERR! code E401
npm ERR! 401 Unauthorized
我尝试了可与此一起使用的所有参数组合(--cafile、--certfile、--keyfile),但结果始终相同。我是不是错过了什么?
似乎一种可行的解决方案是使用 .npmrc 并将 URI 片段前缀到证书变量(没有
https://
部分的 URL)。
.npmrc
registry=https://example.com/repository/group/
//example.com/repository/group/:keyfile=/absolute/path/to/my.key
//example.com/repository/group/:certfile=/absolute/path/to/my.crt
现在简单的
npm i <package_name>
工作,不需要--strict-ssl=false
或设置NODE_TLS_REJECT_UNAUTHORIZED
或NODE_EXTRA_CA_CERTS
环境变量(ssl问题的流行解决方法)。
另一个选项是使用 npm config (仍然需要 URI 片段前缀)。请记住,如果 URI 前缀无效或 crt 文件不存在(或路径无效),npm 不会抛出任何错误。
npm config set //example.com/repository/group/:keyfile=/absolute/path/to/my.key
npm config set //example.com/repository/group/:certfile=/absolute/path/to/my.cert