如何正确配置Node.js以信任自签名根CA证书解决TLS请求报错
问题原因排查
你之前尝试的方案未生效核心是几个Node.js版本特性和执行顺序的坑:
NODE_EXTRA_CA_CERTS仅在 Node.js 进程启动时读取,运行时通过process.env赋值不会生效,你之前的测试逻辑无法验证该环境变量是否正常加载。- Node.js v15 版本中直接修改
tls.rootCertificates数组不生效,该数组仅为内置根证书的静态快照,修改后不会同步到 TLS 校验逻辑中。 - 你写的
tls.createSecureContext猴子补丁如果在node-fetch模块加载之后才执行,node-fetch会保留对原生方法的引用,补丁不会生效。
可行解决方案
方案1:给node-fetch传入自定义HTTPS代理(最稳妥,无全局污染)
不需要修改任何全局配置,仅针对目标接口的请求添加自定义CA,安全性最高:
const fetch = require('node-fetch'); const https = require('https'); const fs = require('fs'); // 替换为你的自签名根CA证书绝对路径 const rootCA = fs.readFileSync('/full/path/to/your/rootCA.pem'); // 生成自定义TLS代理 const customAgent = new https.Agent({ ca: rootCA }); // 调用fetch时传入agent参数即可 const res = await fetch('https://myapi.dev.local/your/api/path', { agent: customAgent }); // 后续正常处理返回结果即可
方案2:全局生效配置
如果需要所有请求都信任该自签名CA,按照以下步骤操作:
- 启动Node进程前就配置好环境变量,不要在代码中赋值,启动命令示例:
NODE_EXTRA_CA_CERTS=/full/path/to/your/rootCA.pem node your-app-entry.js
注意必须使用证书的绝对路径,避免进程运行目录变化导致找不到文件。如果使用pm2等进程管理工具,需要把该环境变量写到进程配置的env字段中。
注意:如果上述操作后仍然报错,需要检查你的 API 站点证书是否配置了正确的「主题备用名称(SAN)」,Node.js 15+ 不再支持将证书通用名(CN)作为域名校验依据,必须在 SAN 字段中明确加入你要访问的域名
myapi.dev.local才能通过校验。
内容的提问来源于stack exchange,提问作者Jordan Breton
相关产品推荐
相关产品推荐

