错误信息
error Error: self-signed certificate in certificate chain
也可能输出为
- error Error: self signed certificate in certificate chain
Yarn 1.x 打印“error Error: …”,后面跟着 Node.js 的堆栈跟踪(at TLSSocket.onConnectSecure …)。Node.js 16 及更早版本写作“self signed”。Yarn 4 以自己的格式报告 TLS 失败:“➤ YN0001: RequestError: <reason>”。
Yarn Classic (1.x) — registry request over HTTPS
含义
Yarn Classic 无法验证注册表的证书,因为证书链终止于一张 Node.js 不信任的自签名根证书。Yarn 原样打印 Node.js 的错误,下面附带堆栈跟踪。在公司网络中,这是执行 TLS 检查的代理的典型症状:浏览器信任它的根证书,Node.js 却不信任。
原因
执行 TLS 检查的代理对 registry.yarnpkg.com 重新签名
常见公司代理出示来自其自有根证书的证书;操作系统信任这个根证书,Node.js 却不信任。
发送自身根证书的私有注册表
偶见使用公司证书的内部注册表;证书链中的根证书仍然必须在客户端上受信任。
Node.js 忽略操作系统的信任库
偶见Yarn 运行在 Node.js 上,而 Node.js 除非另行配置,否则使用内置的根证书列表。
修复方法
- 1.
设置 Yarn 1 的 cafile
用 yarn config set cafile 配置后,Yarn 会依据该 PEM 文件验证注册表;与 npm 的同名设置一样,它会在注册表请求中替换默认的根证书。
bash # Yarn 1.x setting (stored in ~/.yarnrc) yarn config set cafile /etc/ssl/private-ca/corp-proxy-root.pem yarn config get cafile - 2.
或者使用 NODE_EXTRA_CA_CERTS
为 Yarn 以及该环境中的其他所有 Node.js 工具,把根证书添加到 Node.js 的内置列表中。
bash export NODE_EXTRA_CA_CERTS=/etc/ssl/private-ca/corp-proxy-root.pem yarn install - 3.
Yarn 4:httpsCaFilePath
新版 Yarn 从 .yarnrc.yml 读取 httpsCaFilePath;Yarn 4 如果发现旧的 caFilePath 键,就会拒绝启动。
yaml # Yarn 4 (Berry): .yarnrc.yml — Yarn 4 rejects the old caFilePath key httpsCaFilePath: /etc/ssl/private-ca/corp-proxy-root.pem - 4.
临时诊断:strict-ssl false
用于确认问题只出在信任上。包会运行安装脚本,所以让验证一直处于关闭状态,就等于给被调包的软件包敞开大门;测试完成后立即删除这项设置。
bash # Temporary diagnostic only; revert immediately afterwards yarn config set strict-ssl false && yarn install; yarn config delete strict-ssl