macOS CLI 工具 HTTPS 抓包指南(以 OpenCode 为例)
为什么需要 CLI 抓包?
在开发调试 AI 编程助手、API 客户端等命令行工具时,经常需要查看其 HTTPS 请求内容。浏览器有开发者工具,但 CLI 工具的流量对开发者是"不可见"的。本文介绍如何使用 mitmproxy 在 macOS 上实现 CLI 工具的 HTTPS 抓包。
工具选择
在 macOS 上对命令行工具进行 HTTPS 抓包,免费方案首选 mitmproxy。它提供三种使用形态:
- mitmproxy:终端交互式 UI,适合实时过滤和查看
- mitmweb:浏览器 Web UI,JSON 自动格式化,适合内容分析
- mitmdump:纯命令行,适合录制流量到文件或脚本处理
三者共享同一套证书和配置,按需选用即可。
安装
1 | |
第一步:生成 CA 证书
首次运行会自动生成证书文件:
1 | |
证书默认生成在 ~/.mitmproxy/:
1 | |
第二步:信任 CA 证书
1 | |
验证是否成功:打开「钥匙串访问」搜索 mitmproxy,应看到证书标记为受信任。
第三步:启动 mitmproxy
1 | |
默认监听 127.0.0.1:8080。
第四步:配置代理并启动目标程序
新开一个终端:
1 | |
认证
如果你的代理需要基本认证,请在 URL 中包含凭证:
1 | |
注意:避免硬编码密码。使用环境变量或安全的凭证存储。
代理环境变量的通用性说明
上述 HTTP_PROXY、HTTPS_PROXY、NO_PROXY 环境变量是广泛支持的行业标准,并非 OpenCode 专属:
| 变量 | 作用 | 支持范围 |
|---|---|---|
HTTP_PROXY |
HTTP 请求代理 | curl、wget、Python requests、Node.js(部分)、Go、Java(部分)等大多数工具 |
HTTPS_PROXY |
HTTPS 请求代理 | 同上,优先级高于 HTTP_PROXY |
NO_PROXY |
绕过代理的地址列表 | 同上,用于排除内网/本地地址 |
注意事项:
- Node.js / Bun 运行时:原生
fetch和部分 HTTP 库可能不读取这些变量,需要使用proxychains强制代理(见下文) - Go 程序:默认支持,但需确保程序使用标准 HTTP 客户端
- Java 程序:部分支持,可能需要通过 JVM 参数
-Dhttp.proxyHost等配置 - Python 程序:
requests、urllib等主流库默认支持
如果目标程序正常读取代理变量,mitmproxy 界面会显示请求;如果没有流量,说明程序忽略了代理设置,此时应使用 proxychains 强制代理。
第五步:验证是否有流量
在 mitmproxy/mitmweb 界面观察是否有请求进来。如果没有流量,说明目标程序没有读取代理环境变量(这在 Bun、Node.js 原生运行时中很常见)。
此时改用 proxychains 强制代理,不依赖程序自身支持:
1 | |
编辑配置文件 ~/.proxychains/proxychains.conf(没有则新建):
1 | |
然后通过 proxychains 启动目标程序:
1 | |
常见问题
TLS 握手失败 / SSL Error
如果目标程序基于 Node.js 或 Bun,SSL_CERT_FILE 可能不被识别,改用:
1 | |
只想把流量录制到文件
1 | |
只想看特定域名的请求
在 mitmproxy 界面按 f 输入过滤表达式:
1 | |
总结
| 场景 | 方案 |
|---|---|
| 程序正常读取代理变量 | export HTTPS_PROXY + mitmproxy |
| 程序忽略代理变量 | proxychains4 + mitmproxy |
| 只看内容不修改 | mitmweb(Web UI 更直观) |
| 脚本化修改请求 | mitmproxy + Python 插件 |
| 录制留存分析 | mitmdump -w |
通过 mitmproxy,CLI 工具的 HTTPS 流量不再是"黑盒",调试效率大幅提升。