VSCode本身不处理SSL证书或HTTPS协议,本地开发只需单向服务端证书:先运行mkcert -install注入根证书,再执行mkcert localhost 127.0.0.1 ::1生成证书对,确保私钥无密码、路径为绝对路径,并在Node.js服务中正确加载localhost.pem和localhost-key.pem。

VSCode 本身不参与 SSL 证书加载或 HTTPS 协议处理,真正要配的是你运行的 Node.js 服务——而且「双向证书」在本地开发中极少需要,绝大多数场景只需单向(服务端证书),强行加客户端证书会卡死调试流程。
为什么本地开发通常不需要双向 TLS
浏览器访问 https://localhost 时只验证服务端证书是否可信,不要求客户端提供证书;WebRTC、navigator.mediaDevices.getUserMedia()、navigator.geolocation 等 API 只依赖「安全上下文」,即协议为 HTTPS + 域名为 localhost 或已信任的域名,和客户端证书无关。
双向认证(mTLS)常见于企业内网服务间调用、API 网关鉴权等后端场景,本地调试时加它只会导致:
-
ERR_SSL_UNRECOGNIZED_NAME_ALERT或ERR_BAD_SSL_CLIENT_CERT - curl 报错
SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca - 前端 fetch 直接失败,连握手都进不去
正确做法:用 mkcert 生成单向服务端证书
目标是让 https://localhost:3000 被 Chrome/Firefox/Edge 无警告信任。关键步骤不是改 VSCode 设置,而是:
- 运行
mkcert -install(注入根证书到系统信任库,macOS 需重启浏览器,Windows 下 Edge 需手动导入到「受信任的根证书颁发机构」) - 执行
mkcert localhost 127.0.0.1 ::1,生成localhost.pem和localhost-key.pem - 确保私钥无密码:
openssl rsa -in localhost-key.pem -out localhost-key.pem(如果提示输入密码,说明原密钥被加密,必须解密) - Node.js 中读取路径必须是绝对路径,推荐用
path.resolve(__dirname, 'localhost-key.pem'),避免相对路径错位
Node.js https.createServer 加载证书的典型错误
常见报错如 Error: error:0909006C:PEM routines:get_name:no start line 或 ENOENT: no such file,本质是文件读取失败:
-
fs.readFileSync('./key.pem')—— 路径相对于当前工作目录(process.cwd()),不是.js文件所在目录 - 证书文件权限问题:Linux/macOS 下私钥不能有 group/other 可读权限,否则 Node 拒绝加载,需
chmod 600 localhost-key.pem - 编码错误:用
fs.readFileSync('key.pem', 'utf8')读 PEM 文件没问题,但若用二进制方式读再 toString() 可能引入不可见字符 - 证书链缺失:如果用了中间 CA(比如 Let's Encrypt),需把 fullchain.pem 和 key.pem 一起提供,仅 cert.pem 不够
局域网设备访问 https://192.168.x.x:3000 的真实限制
mkcert 默认只签 localhost、127.0.0.1、::1,**不会自动信任 192.168.x.x**。想让手机或另一台电脑通过 IP 访问且不报证书错误,必须:
- 生成证书时显式包含局域网 IP:
mkcert localhost 127.0.0.1 ::1 192.168.1.100(替换成你本机实际 IP) - 手机端需手动安装 mkcert 根证书(Android 在设置 → 安全 → 加密与凭据 → 安装证书;iOS 需通过 Safari 下载 .pem 文件并进入「设置 → 已下载描述文件」安装)
- 证书生效后仍需在手机浏览器里访问一次
https://192.168.1.100:3000并点击「继续前往」(iOS 首次需在「设置 → 通用 → 关于本机 → 证书信任设置」中开启根证书信任)
注意:Chrome for Android 从 107 版起不再支持用户导入的根证书,只能靠系统级安装;iOS 17+ 对自签名证书更严格,务必确认根证书已启用信任。


















