典型现象是 npm/yarn 安装卡在 tls 握手并报 depth_zero_self_signed_cert 等错误,根本原因是企业网关或代理拦截 https 导致证书校验失败;node_tls_reject_unauthorized=0 仅作用于 node 原生 https 模块,而 npm、yarn、vscode 内嵌 node 等常绕过该变量,需分别配置 strict-ssl false 或更安全地通过 node_extra_ca_certs 注入企业根证书。

Node全局SSL下载被阻断的典型现象
执行 npm install 或 yarn add 时卡在 TLS 握手、报错 DEPTH_ZERO_SELF_SIGNED_CERT 或 UNABLE_TO_GET_ISSUER_CERT_LOCALLY;node -e "require('https').get(...)" 直接失败;VSCode 内置终端也复现相同错误——说明不是 VSCode 自身问题,而是 Node 运行时层面的证书校验被企业网关或代理拦截。
为什么 NODE_TLS_REJECT_UNAUTHORIZED=0 不总管用
该环境变量只影响 Node 原生 https 模块,但很多工具(如 npm、yarn、pnpm)会绕过它,自行做证书校验;Electron 内嵌的 Node(即 VSCode 终端)也未必完全继承该变量,尤其在 Windows 上常因 shell 启动方式丢失。
- Windows 下通过快捷方式启动 VSCode,默认不加载系统环境变量,
NODE_TLS_REJECT_UNAUTHORIZED可能未生效 -
npm有独立配置项:npm config set strict-ssl false才真正关闭其 SSL 校验 -
yarn需额外设置:yarn config set strict-ssl false,且 v1 和 v2+ 行为不同
VSCode 终端中让 Node 信任企业根证书
比禁用校验更安全的做法:把企业中间人代理的根证书显式注入 Node 的信任链。关键不是“跳过”,而是“告诉它信谁”。
- 先导出企业 CA 证书(通常从浏览器导出 PEM 格式,或从
certmgr.msc→ “受信任的根证书颁发机构”里保存) - 设环境变量:
NODE_EXTRA_CA_CERTS=/path/to/your-ca.crt(Linux/macOS)或set NODE_EXTRA_CA_CERTS=C:\ca.crt(Windows CMD) - VSCode 终端需重启才能读取新环境变量;若用 PowerShell 启动,确认
$env:NODE_EXTRA_CA_CERTS已设置 - 验证是否生效:
node -e "console.log(require('tls').rootCertificates.length)"—— 数值应明显大于默认的 ~120
Remote-SSH 场景下证书失效怎么办
本地配了 NODE_EXTRA_CA_CERTS,但远程服务器上 Node 仍报 SSL 错误——因为 Remote-SSH 的 vscode-server 进程运行在远端,完全不读本地环境变量。
- 必须在远程机器的
~/.bashrc或~/.zshrc中 exportNODE_EXTRA_CA_CERTS(注意路径是远程的) - 或者,在远程
~/.vscode-server/data/Machine/settings.json中加:"terminal.integrated.env.linux": {"NODE_EXTRA_CA_CERTS": "/home/user/ca.crt"} - 改完必须彻底断开并重连 SSH,不能只 reload 窗口
- 别依赖
npm config set cafile:它只对 npm 生效,不影响node-fetch、axios等库
最易被忽略的是:证书路径在远程必须可被 vscode-server 进程读取,且权限不能太宽松(比如 chmod 600 可能导致 Node 拒绝加载)。











