如何让 Chrome 信任 localhost 的自签名证书
本地 HTTPS 推荐用 mkcert 创建开发 CA 和带 SAN 的证书,再确认 Chrome 信任配置。不同平台信任库行为不同;不要关闭浏览器证书校验,也不要分发 CA 私钥。
一句话回答:本地开发可用 mkcert 创建本机开发 CA、安装信任并签发 localhost 证书。证书必须包含所访问域名/IP 的 SAN。Chrome 的根证书管理与本地信任集成依平台、版本和策略而异,Linux 上仅更新系统 CA 不保证 Chrome 已信任,应检查浏览器证书管理页。只信任自己生成或来源已验证的开发 CA。
推荐方案:mkcert(一条命令)
手写 openssl 自签证书容易漏掉 SAN(Chrome 要求证书必须有 Subject Alternative Name),mkcert 全自动:
# 安装(macOS: brew install mkcert / Ubuntu: apt install mkcert / Windows: choco install mkcert)
mkcert -install # 创建本地 CA 并装入系统信任库
mkcert localhost 127.0.0.1 ::1 # 签发 localhost 证书
# 得到 localhost+2.pem 和 localhost+2-key.pem,配置到本地服务器即可
mkcert 生成的证书带正确的 SAN,mkcert 支持的浏览器可使用相应信任配置,Firefox/Linux 场景可能需要 NSS 工具及正确的配置文件,强烈推荐替代手工 openssl 流程。
手工方案:openssl 自签 + 系统信任
第一步:生成证书(注意 SAN,新版 Chrome 没 SAN 必报错)
openssl req -x509 -newkey rsa:2048 -nodes -days 365 -keyout localhost.key -out localhost.crt -subj "/CN=localhost" -addext "subjectAltName=DNS:localhost,IP:127.0.0.1"
第二步:装入系统信任库
- Windows:双击
localhost.crt→ 安装证书 → 本地计算机 → 放入"受信任的根证书颁发机构" - macOS:钥匙串访问 → 拖入
localhost.crt→ 双击 → 信任 → "使用此证书时"选始终信任 - Linux:Debian/Ubuntu 的系统信任可用
update-ca-certificates更新,但 Chrome 的本地信任存储可能另需配置;在chrome://certificate-manager(旧版为设置中的证书管理)导入开发 CA,并确认对应版本行为
第三步:完全重启 Chrome(chrome://restart)后访问 https://localhost 验证。
几个坑
- 证书必须带 SAN:只填 CN 的老做法已被 Chrome 拒绝(NET::ERR_CERT_COMMON_NAME_INVALID)
- Firefox 行为依平台与企业根设置而异:确认系统根证书集成是否启用,必要时导入开发 CA;不能一概说从不使用系统信任
- 别对生产环境这么干:该流程仅限本地开发;把自签 CA 装进系统信任库意味着它签的任何证书都被信任,mkcert 的根钥要保管好
- 不要依赖绕过开关:实验 flags 可能移除,不应把关闭证书校验作为修复;测试完成后移除不再需要的开发根信任,mkcert 的
rootCA-key.pem不可共享
常见问题(FAQ)
Q:为什么信任了还是提示不安全?
A:按顺序查:证书是否含 SAN(openssl x509 -in localhost.crt -text -noout | grep -A1 "Subject Alternative Name");Chrome 是否完全重启;装到了"受信任的根证书颁发机构"而不是其他存储;证书域名与访问地址是否一致(访问 127.0.0.1 时证书里要有该 IP 的 SAN)。
Q:localhost 到底要不要 HTTPS?
A:多数情况不需要——浏览器把 http://localhost 视为安全上下文,Service Worker、地理位置等 API 都可用。需要复现 TLS 行为或某个集成明确要求 HTTPS 时再配置;OAuth、Cookie 和 HTTP/2 的具体要求仍取决于服务和浏览器,不能一概而论。
Q:团队每人都要配一遍吗?
A:mkcert 的 CA 是每人本机独立的,所以是的,每人跑一次 mkcert -install + 签发。可以把签发命令写进项目的 dev 脚本(如 npm run cert)降低摩擦。
核查依据
本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。