错误信息
Error: ERR_PNPM_RESOLVING_NPM_RESOLVER_NETWORK_ERROR
也可能输出为
- Error: ERR_PNPM_PACKAGE_MANAGER_ADD_RESOLVE_LATEST
标题行中的错误码取决于命令:pnpm install 为 ERR_PNPM_RESOLVING_NPM_RESOLVER_NETWORK_ERROR,pnpm add 为 ERR_PNPM_PACKAGE_MANAGER_ADD_RESOLVE_LATEST。其下的原因链内容为“Failed to fetch metadata from <url>: error sending request: client error (Connect): invalid peer certificate: UnknownIssuer”,并按 80 列自动换行。pnpm 10 及更早版本运行在 Node.js 上,报告的则是 SELF_SIGNED_CERT_IN_CHAIN 或 UNABLE_TO_GET_ISSUER_CERT_LOCALLY 等 Node.js 错误码。
pnpm 12 (native binary, rustls) — registry request over HTTPS fails with "invalid peer certificate: UnknownIssuer"
含义
pnpm 12 无法从注册表获取包元数据,它打印的原因链以“invalid peer certificate: UnknownIssuer”结尾:这是 TLS 验证失败。pnpm 12 是原生二进制程序,其 HTTP 客户端用 rustls 验证证书,而“UnknownIssuer”是 rustls 对所有证书链构建失败统一使用的错误码:未知的私有 CA、代理根证书、缺失的中间证书或自签名证书。
原因
先看最后一行:这个错误码也涵盖普通的网络错误
常见ERR_PNPM_RESOLVING_NPM_RESOLVER_NETWORK_ERROR 这个错误码也用于 DNS、连接和代理故障。只有当原因链以“invalid peer certificate”结尾时,才是证书问题。
使用公司证书的私有注册表
常见内部注册表的证书由公司 CA 签发,而该 CA 不在 pnpm 信任的 CA 集合中。
执行 TLS 检查的代理
常见在公司网络中,代理会用自己的根证书对 registry.npmjs.org 重新签名。
注册表使用自签名证书或只发送叶子证书
偶见rustls 不区分这些情况:自签名证书和缺失的中间证书最终同样报告为 UnknownIssuer。
修复方法
- 1.
在 .npmrc 中设置 cafile
pnpm 读取 npm 风格的配置文件;cafile(或内联的 ca 值)会为注册表请求添加该 CA。
ini ; .npmrc (project or ~/.npmrc) — read by pnpm as well as npm cafile=/etc/ssl/private-ca/corp-root-ca.pem - 2.
将根证书安装到操作系统的证书存储
在我们的测试中,pnpm 12 接受了通过 update-ca-certificates 添加的根证书,因此 IT 部门部署的根证书无需额外配置即可生效。
bash # pnpm 12 also trusts the operating system's store sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt sudo update-ca-certificates - 3.
或者使用 NODE_EXTRA_CA_CERTS
pnpm 12 同样支持这个变量,这样 Node.js、npm 和 pnpm 就可以共用同一项设置。
bash # Honoured by pnpm 12 too, so one variable covers node, npm and pnpm export NODE_EXTRA_CA_CERTS=/etc/ssl/private-ca/corp-root-ca.pem pnpm install