应将企业ca证书添加到node.js信任链,而非设置node_tls_reject_unauthorized=0;需导出pem格式ca证书、合并系统ca、通过node_extra_ca_certs环境变量注入,并在vscode的settings.json和launch.json中分别配置路径。

Node.js 进程报 “unable to verify the first certificate” 怎么办
这不是 VSCode 的 bug,而是你本地启动的 node 进程(比如调试、终端运行脚本、插件调用 CLI)在企业网络下无法验证 HTTPS 响应证书。根本原因是公司代理做了 SSL Inspection,签发了中间人证书,而 Node.js 默认不信任它。
常见现象包括:axios 请求内网 GitLab 失败、fetch 调用 https://api.internal 报错、npm install 卡在证书校验、VSCode 调试时断点进不去但终端里能跑通——这些都指向同一个根因:Node.js 的 CA 信任链没加载企业根证书。
- 不要设
NODE_TLS_REJECT_UNAUTHORIZED=0—— 它会让所有 HTTPS 请求跳过校验,密钥、登录态、API token 全部裸奔 - 不要只改系统证书库(如 Windows Cert Store 或 macOS Keychain)—— VSCode 启动的 Node.js 进程不自动读取它们
- 必须显式把企业 CA 加入 Node.js 自身的 CA 池,靠
NODE_EXTRA_CA_CERTS环境变量注入
如何导出并合并企业 CA 证书为 PEM 格式
IT 部门通常提供的是 .cer 或 .crt 文件,但 Node.js 只认 PEM 格式(Base64 编码、以 -----BEGIN CERTIFICATE----- 开头)。如果直接双击安装到系统,Node.js 仍不可见。
Linux/macOS 下转换命令:
openssl x509 -inform DER -in company-ca.cer -out company-ca.pem
Windows 下可用 PowerShell 手动转(或用在线工具确认格式),关键看文件开头是否为 -----BEGIN CERTIFICATE-----。
- 若有多张证书(如根 CA + 中间 CA),用
cat ca1.pem ca2.pem > node-ca-bundle.pem合并成单个 PEM 文件 - 路径建议放固定位置,比如
/opt/certs/internal-ca.pem(Linux/macOS)或C:\certs\internal-ca.pem(Windows) - 确保该文件对当前用户可读,尤其在 WSL 或远程容器中,路径必须是目标环境能访问的路径(不是 Windows 主机上的
C:\)
VSCode 终端和调试器必须分别配置 NODE_EXTRA_CA_CERTS
NODE_EXTRA_CA_CERTS 是进程级环境变量,VSCode 的集成终端和调试器(launch.json 启动的 Node 进程)是两个独立上下文,彼此不继承环境变量。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
settings.json 中配了只影响终端:
"terminal.integrated.env.linux": {"NODE_EXTRA_CA_CERTS": "/opt/certs/internal-ca.pem"}
但 launch.json 中不加,调试照样失败。每个 configuration 都要显式写进去:
"env": {"NODE_EXTRA_CA_CERTS": "/opt/certs/internal-ca.pem"}
- WSL 用户注意:路径必须是 Linux 视角,例如
/home/user/certs/internal-ca.pem,不是C:\Users\xxx\certs\... - Remote-SSH 场景下,证书文件必须存在于远程服务器上,且路径与 launch.json 中一致
- 验证是否生效:在 VSCode 终端运行
node -e "console.log(require('https').globalAgent.options.ca?.length)",输出值应明显大于默认的 ~110
为什么 Remote-SSH 和某些扩展仍报错 net::ERR_CERT_AUTHORITY_INVALID
VSCode 自身(Electron 渲染进程)和部分扩展(如 Tabnine、Remote-SSH 的元数据同步)走的是 Chromium 网络栈,只信任操作系统级证书库,不读 NODE_EXTRA_CA_CERTS。
这类问题不能靠 Node.js 层解决,需补充配置:
- 在 settings.json 中加:
"http.proxyStrictSSL": false—— 仅影响 VSCode 内置 HTTP 客户端(如扩展市场、GitHub 登录) - Remote-SSH 若用私有 CA,需在远程主机上把证书导入系统证书库:
sudo cp internal-ca.pem /usr/local/share/ca-certificates/ && sudo update-ca-certificates - 国产化系统(麒麟、UOS)默认不含内部 CA,必须手动执行上述导入,否则
curl https://gitlab.internal都失败
最常被忽略的是:证书路径在 launch.json 里写错,或者没同步到远程环境,导致调试时证书加载失败,但终端里 npm install 却正常——这种割裂感容易让人误判问题根源。










