根本原因是node.js tls层拒绝自签名证书,需在node.js层解决:临时禁用校验(开发用rejectunauthorized: false)或导入证书到ca列表(node_extra_ca_certs),vite/webpack代理需设secure: false。

VSCode 里 Node.js 脚本调用 HTTPS 接口失败,报 SELF_SIGNED_CERT_IN_CHAIN,根本原因不是 VSCode 本身,而是它启动的 Node.js 进程继承了系统或网络环境中的证书策略 —— 解决必须从 Node.js 层下手,而不是只改 VSCode 设置。
Node.js 脚本运行时遇到 SELF_SIGNED_CERT_IN_CHAIN 错误
这个错误来自 Node.js 的 TLS 层,说明你代码里用 https.request、axios、fetch(底层是 node-fetch 或 undici)等发起 HTTPS 请求时,目标服务用了自签名证书,而 Node.js 默认拒绝这种证书链。
常见触发场景:本地开发后端启用了 HTTPS(如 Express + 自签名 cert)、调用公司内网 API、Vite/webpack dev server 代理到带自签名证书的测试环境。
- 错误堆栈里一定包含
TLSSocket.onConnectSecure和code: 'SELF_SIGNED_CERT_IN_CHAIN' - VSCode 的「GitHub 登录失败」是同类问题,但那是 VSCode 自身 Electron 环境的 HTTP 客户端行为;你写的 Node.js 脚本是独立进程,不受
http.proxyStrictSSL控制 - 即使你在 VSCode 里关掉了
http.proxyStrictSSL,运行node index.js仍会报错
在脚本中临时禁用证书校验(仅限开发)
最直接的办法是在代码开头加一行环境变量设置,或在请求选项里显式关闭校验。这是最快验证是否为证书问题的手段。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 全局禁用(不推荐长期使用):
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';,放在require任何网络模块之前 - 局部禁用(推荐):如果用原生
https模块,给options加rejectUnauthorized: false - 如果用
axios,配置httpsAgent:new https.Agent({ rejectUnauthorized: false }) - 如果用
node-fetch(v3+),传{ dispatcher: new Agent({ rejectUnauthorized: false }) }
注意:rejectUnauthorized: false 不等于跳过全部 TLS,它只跳过证书链验证,加密通道依然建立,但无法防御中间人攻击 —— 切勿用于生产环境或处理敏感数据。
让 Node.js 信任你的自签名证书(安全且可复现)
比全局关校验更稳妥的做法,是把自签名证书加入 Node.js 的可信 CA 列表。这需要两步:拿到证书文件(.crt 或 .pem),然后告诉 Node.js 去读它。
- 用
NODE_EXTRA_CA_CERTS环境变量(推荐):NODE_EXTRA_CA_CERTS="/path/to/cert.crt" node index.js - 在脚本里读取并注入(适合打包或统一配置):
ca: fs.readFileSync('/path/to/cert.crt')传给https.request或https.Agent - 确认证书内容正确:用
openssl x509 -in cert.crt -text -noout看是否包含Subject:和有效日期,避免复制了私钥或格式错乱 - Windows 用户注意路径分隔符,用正斜杠
/或双反斜杠\,单反斜杠会触发转义问题
Vite / Webpack Dev Server 代理转发时的证书问题
如果你的前端项目用 Vite 启动 dev server,再通过 proxy 转发请求到后端 HTTPS 服务,报错通常出现在代理层,而非你的业务代码。
- Vite 配置里必须设
secure: false(不是strictSSL: false):server.proxy['/api'] = { target: 'https://localhost:8080', secure: false } - Webpack DevServer 对应字段是
secure: false,同样不能写成rejectUnauthorized: false - 这个
secure: false是指「允许代理连接到不安全的 HTTPS 目标」,和 Node.js 的rejectUnauthorized语义一致,但配置位置不同 - 如果代理目标是
https://127.0.0.1而不是https://localhost,某些证书可能因 SAN(Subject Alternative Name)不匹配被拒,需重新生成含 IP 的证书
真正容易被忽略的是:VSCode 的终端、调试器(Run and Debug)、Tasks 三者启动 Node.js 进程的方式不同,环境变量继承行为也不一致 —— 比如通过 launch.json 启动调试时,env 字段要手动加 NODE_TLS_REJECT_UNAUTHORIZED,否则照样报错。










