用 mkcert 可快速生成本地可信 HTTPS 证书,解决 WebRTC 等 API 因非安全上下文被禁用的问题:先运行 mkcert -install 注入根证书,再执行 mkcert localhost 127.0.0.1 ::1 生成证书对,最后按工具链要求配置 HTTPS 服务并确保访问 https://localhost:3000。

用 mkcert 快速生成可信本地 HTTPS 证书
VSCode 本身不提供 HTTPS 服务器功能,真正要解决的是「如何让本地起的 Web 服务(比如 python -m http.server、npm run dev、webpack-dev-server)跑在 https://localhost:3000 上」。WebRTC 的 getUserMedia 和现代浏览器的 API(如 navigator.geolocation)强制要求安全上下文,HTTP localhost 已不被信任(Chrome 117+ 起彻底禁用)。
最轻量且跨平台的方案是用 mkcert 生成本地 CA 签发的证书,系统/浏览器会信任它:
- 先装
mkcert:choco install mkcert(Windows)、brew install mkcert nss(macOS)、或从 GitHub release 下载二进制 - 运行
mkcert -install—— 这步把根证书注入系统和 Chrome/Firefox(Edge 需手动导入到“受信任的根证书颁发机构”) - 生成证书对:
mkcert localhost 127.0.0.1 ::1,输出localhost-key.pem和localhost.pem
给常见本地服务加 HTTPS(Node.js / Python / Vite)
证书有了,下一步是让开发服务器加载它。不同工具链配置位置和参数名差异大,容易配错端口、路径或忽略私钥权限问题:
-
Vite:在
vite.config.ts里加server: { https: { key: fs.readFileSync('./localhost-key.pem'), cert: fs.readFileSync('./localhost.pem') } };注意路径是相对于项目根目录,不是vite.config.ts所在目录 -
Webpack Dev Server:启动命令加
--https --key ./localhost-key.pem --cert ./localhost.pem;别漏掉--https,否则只读证书不生效 -
Python HTTP server:用
python -m http.server 3000 --bind localhost:3000不支持 HTTPS;改用https-server(npm install -g https-server),然后https-server -p 3000 -c localhost.pem -k localhost-key.pem -
Node.js 原生
https.createServer:确保fs.readFileSync路径正确,且私钥文件不能有密码(openssl rsa -in protected.key -out localhost-key.pem解密)
Chrome / Edge 访问时仍报 NET::ERR_CERT_AUTHORITY_INVALID
这不是 VSCode 的问题,而是证书没被浏览器真正信任。常见原因有三个:
- 执行了
mkcert -install,但没重启浏览器(尤其是 Edge,它复用 Windows 证书存储,有时需重启系统) - 证书是给
localhost生成的,但你在地址栏输的是http://127.0.0.1:3000或https://[::1]:3000—— 必须用https://localhost:3000,否则域名不匹配 - Mac 上 Safari 用钥匙串访问,需手动把
rootCA.pem拖进「系统」钥匙串,并双击设为「始终信任」;Chrome 会同步系统钥匙串,但有时延迟,可清空chrome://settings/certificates中的旧条目再重试
调试 WebRTC 时 HTTPS 不够,还缺 localhost 的特殊豁免
即使 HTTPS 跑起来了,RTCPeerConnection 在某些场景下仍可能报 Failed to execute 'createOffer' on 'RTCPeerConnection': Cannot create offer with no local tracks and no offerToReceive*——这和 HTTPS 无关,而是媒体设备权限未触发。关键点是:
- 必须用
https://localhost:xxx,不能是https://127.0.0.1:xxx,哪怕证书里包含了127.0.0.1;Chrome 对localhost有硬编码豁免,允许调用getUserMedia而无需用户手动点击授权(仅限 localhost) - 如果用自定义域名(如
https://myapp.test),哪怕证书有效,也必须先在页面上由用户主动点击按钮触发getUserMedia,否则静默失败 - 检查
navigator.mediaDevices是否为undefined:只有在安全上下文(HTTPS + localhost)下才存在;如果不存在,说明 HTTPS 没生效或用了错误域名
证书路径写错、浏览器没重启、地址栏敲错域名——这三个点卡住的人最多。其他都是顺带的事。


















