Node.js启用mTLS双向认证需在https.createServer中设置requestCert: true、rejectUnauthorized: true,并传入ca根证书;VSCode仅作为编辑调试工具,不参与证书验证,Live Server插件也不支持mTLS。

VSCode 本身不参与 HTTPS 双向证书认证(mTLS)的配置或验证,它只是编辑器;真正起作用的是你运行的 Node.js 服务本身。要测试双向证书认证,必须在 Node.js 的 https.createServer 中显式启用 requestCert: true 和 rejectUnauthorized: true,并正确加载 CA 根证书、客户端证书与私钥——VSCode 只负责让你能写、调试、启动这段代码。
Node.js 启动 HTTPS 服务时如何启用双向认证
双向认证不是开个开关就行,核心是让服务端主动要求客户端提供证书,并用你信任的 CA 根证书去校验它。关键参数不能漏:
-
requestCert: true:强制客户端提供证书(否则连接直接拒绝) -
rejectUnauthorized: true:启用证书链校验(设为false就退化成单向 HTTPS,失去“双向”意义) -
ca字段必须传入 PEM 格式的 CA 根证书内容(不是客户端证书!),通常用fs.readFileSync('./ca.pem') - 客户端证书和私钥由浏览器或 curl 提供,服务端不加载它们——那是请求方的事
示例片段(非完整 server):
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('./server-key.pem'),
cert: fs.readFileSync('./server-cert.pem'),
ca: fs.readFileSync('./ca.pem'), // ← 必须是你签发客户端证书的那张根证书
requestCert: true,
rejectUnauthorized: true
};
https.createServer(options, (req, res) => {
console.log('Client certificate:', req.client.authorized ? 'valid' : 'rejected');
res.end('Hello mTLS');
}).listen(3000);
用 curl 测试双向认证是否生效
浏览器对双向认证支持差(Chrome 自 2021 年起已移除 UI 支持),必须用 curl 或 Postman 手动注入客户端证书。常见失败原因是路径错、密码错、证书链不全:
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 确保
--cert指向客户端证书(client.pem),不是服务端证书 -
--key指向对应私钥(client-key.pem),若加密需加--pass 'xxx' -
--cacert必须是服务端信任的 CA 根证书(即上面options.ca用的同一张ca.pem) - 命令示例:
curl --cert client.pem --key client-key.pem --cacert ca.pem https://localhost:3000/ - 如果返回
curl: (35) ssl_handshake_failed,大概率是 CA 不匹配或客户端证书没被该 CA 签发
VSCode 调试时证书路径容易出错的点
你在 launch.json 里配 https.createServer 的参数时,路径解析基于 cwd(当前工作目录),不是 launch.json 所在位置:
-
fs.readFileSync('./ca.pem')的.是你按 F5 启动时终端所在的目录,通常是项目根目录 - 如果证书放在
./certs/下,就得写fs.readFileSync('./certs/ca.pem'),别想当然放根目录就省略路径 - Windows 路径斜杠不用转义,
fs.readFileSync('certs\ca.pem')反而可能出错,统一用正斜杠 - 证书文件必须是 PEM 格式(以
-----BEGIN CERTIFICATE-----开头),DER 或 PFX 会报ERR_OSSL_PEM_NO_START_LINE
为什么 VSCode Live Server 插件无法做双向认证
Live Server 是一个静态文件服务器,底层用的是 http-server 或类似轻量模块,它只支持单向 HTTPS(即服务端给证书),根本不暴露 requestCert 或 ca 配置项。试图在 liveServer.settings.https 里塞 ca 字段完全无效——插件压根不读这个字段。
需要双向认证,就必须自己写 Node.js 服务(哪怕只有 10 行),用原生 https 模块或 Express + https,然后在 VSCode 里通过 launch.json 启动调试。别指望任何“一键 HTTPS”的插件能搞定 mTLS。

















