在 macos 中实现本地 https 需先将自签名根证书导入“系统”钥匙串并单独设 ssl 为“始终信任”,再用其签发终端证书配置服务,最后同步信任至 ios 设备。
在 macos 中让本地开发环境(比如 localhost:3000 或 myapp.test)通过 https 安全访问,关键不是“安装根证书”就完事,而是把自签名根证书正确导入系统钥匙串,并为它设置明确的、面向具体用途的信任策略。否则浏览器或系统仍会报“不安全连接”。
一、生成并导入自签名根证书
你需要一个自签名的根证书(CA),用来签发本地服务的终端证书(如 localhost.crt)。常见做法是用 OpenSSL 或工具如 mkcert:
- 推荐使用
mkcert(已预编译、免配置):brew install mkcert nss # macOS + Firefox 支持需要 nss mkcert -install # 自动创建并信任根证书(存于 "$(mkcert -CAROOT)/rootCA.pem")
这一步会在钥匙串中自动添加一条名为 mkcert development CA 的证书,并设为“始终信任”——但注意:它默认只对 SSL 用途生效,其他场景(如代码签名、邮件)仍受限。
如果你手动用 OpenSSL 创建了根证书(如 ca.crt),需手动导入:
- 双击
ca.crt→ 选择“系统”钥匙串 → 输入密码确认; - 打开“钥匙串访问”,在左侧选“系统”,找到该证书,双击打开;
- 展开“信任”,点击“SSL”下拉菜单,选 “始终信任”;
- 关闭窗口,输入密码保存更改。
⚠️ 仅勾选“始终信任”顶部总开关不够,必须在每个具体用途(尤其是 SSL)里单独设置。
二、为本地域名签发终端证书并配置服务
根证书只是信任基础,你还得用它签一个对应你开发域名的证书,例如:
mkcert localhost 127.0.0.1 ::1 myapp.test
会生成 localhost+2.pem 和 localhost+2-key.pem。
将它们配置到你的本地服务(如 Webpack Dev Server、Express、Nginx)中,确保服务监听 HTTPS 并加载这对证书。
确保 hosts 文件包含映射(如 127.0.0.1 myapp.test),否则域名不匹配会导致证书无效。
三、验证与调试信任状态
浏览器访问 https://myapp.test 时仍报错?检查以下几点:
- 是否在“钥匙串访问”的 “系统” 钥匙串中看到根证书?用户钥匙串里的证书不会被系统级网络栈信任。
- 根证书的“信任”设置中,“SSL”一项是否明确设为“始终信任”?不要只依赖顶部“始终信任”总开关。
- 终端证书是否由该根证书签发?可用命令验证:
openssl verify -CAfile ca.crt localhost.crt
- 浏览器是否缓存了旧证书错误?尝试无痕窗口,或清除证书错误缓存(Safari:开发菜单 → 清除 SSL 状态;Chrome:
chrome://restart)。
四、处理特殊场景:iOS 模拟器 / 真机调试
macOS 上配置的根证书不会自动同步到 iOS 模拟器或真机:
- 对模拟器:需手动将
ca.crt拖入模拟器桌面,点击安装,然后进入「设置 → 已下载描述文件 → 安装」→ 「设置 → 通用 → 关于本机 → 证书信任设置」开启对根证书的完全信任。 - 对真机:通过 AirDrop 或邮件发送
.crt文件,同样安装后需在「设置 → 通用 → 关于本机 → 证书信任设置」中启用。
没有这一步,即使 macOS 本地访问正常,React Native、Flutter 或 WebView 调试仍会失败。
不复杂但容易忽略











