1.
准备工作与工具选择
- 选择工具:推荐使用 mitmproxy(开源)或 Charles(商业)进行 HTTPS 拦截。
- 下载安装:mitmproxy 可通过 Homebrew 安装:brew install mitmproxy;Charles 下载并安装 dmg。
- 权限与网络:确保你有 macOS 管理员权限,并关闭影响代理的 VPN 或企业网络策略。
2.
在代理上生成或获取根证书(CA)
- 使用 mitmproxy:启动 mitmproxy 一次后,默认 CA 会生成在 ~/.mitmproxy/;文件名 mitmproxy-ca-cert.pem。
- 使用 OpenSSL 自建 CA(可选):openssl genrsa -out myCA.key 4096;openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.crt。
- 注意私钥权限:chmod 600 myCA.key,确保只有管理员可读。
3.
将 CA 导入 macOS Keychain 并设为信任
- 图形方式:打开“钥匙串访问”,拖入 myCA.crt,双击该证书,展开“信任”,在“使用此证书时”选择“始终信任”。输入管理员密码确认。
- 命令行方式(示例):sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /path/to/myCA.crt。
- 校验:在 Safari 输入 https://mitm.it(或访问目标站点)确认没有证书警告。
4.
配置 macOS 系统代理并使 Safari 使用
- 系统偏好设置:系统偏好 -> 网络 -> 选择使用的接口(Wi‑Fi)-> 高级 -> 代理,勾选 HTTP、HTTPS 代理并填入代理地址与端口(例如 127.0.0.1:8080)。
- PAC 文件(可选):如果只想针对 Safari 设置,创建 proxy.pac 并在自动代理配置 URL 中填写文件路径。
- 验证生效:Safari 访问 http://ifconfig.me 检查出口 IP,或访问 mitmproxy 的 web 界面(例如 http://127.0.0.1:8081)。
5.
拦截 HTTPS 的实际操作要点
- 启动代理:mitmproxy -p 8080 --mode regular;或在 Charles 中开启 SSL Proxying,添加需要拦截的主机域名。
- 过滤规则:只拦截特定域名以降低风险,例如在 mitmproxy 中使用 --ignore-hosts 或在 Charles 中添加只对特定域启用 SSL Proxying。
- HSTS 与证书固定:对于启用了 HSTS 或证书固定的网站无法绕过;在测试时避免尝试针对生产服务强行绕过。
6.
证书管理与安全加固建议
- 私钥保管:CA 私钥应只保存在受限环境,使用 FileVault 或硬件安全模块(HSM)更安全。
- 最小信任范围:将证书只导入到 System keychain 并设置 ACL,仅在测试机器上信任。
- 清理与撤销:使用完毕后,删除 Keychain 中的证书并撤销代理:sudo security delete-certificate -c "Your CA Name" /Library/Keychains/System.keychain;删除本地 CA 文件与配置。
7.
问题:在 Safari 中导入证书后仍显示不受信任怎么办?
- 检查步骤:确认证书已导入 System(系统)钥匙串而非“登录”钥匙串;检查证书的“始终信任”设置;重启 Safari 和系统网络服务。
- 命令排查:使用 security find-certificate -a -p /Library/Keychains/System.keychain | openssl x509 -noout -text 查看证书详情。
8.
问题:如何安全地限制代理对外访问以防止滥用?
- 本地绑定:让代理只监听 127.0.0.1(mitmproxy -b 127.0.0.1 -p 8080),避免暴露到局域网。
- 认证与防火墙:对外服务必须启用 TLS 与认证,使用 pf 或应用层访问控制限制来源 IP。
9.
问题:如何在脚本或 CI 中自动导入并信任证书?
- 自动化导入示例:sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /path/to/myCA.crt;随后运行 sudo killall -HUP mDNSResponder 或重启网络服务以确保证书生效。
- 清理示例:sudo security delete-certificate -Z
/Library/Keychains/System.keychain,建议在 CI 完成后执行清理步骤以避免残留信任。
10.
总结与最佳实践提醒
- 只在受控测试环境使用 HTTPS 拦截,不对生产用户或第三方流量启用。
- 保持 CA 私钥安全、最小化信任范围、定期清理并记录变更,遵循公司合规与隐私政策。
来源:安全加固 mac safari代理服务器 HTTPS拦截与证书管理注意事项