HTTP/HTTPS 中间人(MITM)代理,内置实时 Web UI,支持流量拦截与分析。单文件部署,无需额外依赖。
go:embed 嵌入到 Go 二进制,零依赖运行客户端(浏览器) ↓ 配置代理 http://localhost:8080 代理服务器(mitm-proxy) ├── HTTP 请求:直接拦截并转发 └── HTTPS 请求(CONNECT 隧道): 动态签发目标域名证书 → 与客户端建立 TLS → 与真实服务器建立 TLS 解密流量 → 记录到 Store → 重新加密发回客户端 ↓ 真实服务器
代理使用 ECDSA P-256 自签名 CA 证书,为每个访问的域名动态签发证书,实现 HTTPS 流量的透明解密。
前提条件:
bashgit clone https://git.woa.com/johnezhou/mitm-proxy.git
cd mitm-proxy
# 构建(自动编译前端 + Go 二进制)
make build
# 二进制输出到 bin/mitm-proxy
./bin/mitm-proxy --help
bash# 构建镜像
make docker
# 运行容器
make docker-run
# 等价于:
# docker run -p 8080:8080 -p 8081:8081 \
# -v ~/.mitm-proxy:/root/.mitm-proxy \
# mitm-proxy:latest
bash# 默认配置启动(代理端口 8080,Web UI 端口 8081)
./bin/mitm-proxy start
# 自定义端口
./bin/mitm-proxy start --proxy-port 9090 --ui-port 9091
# 增加流量记录容量
./bin/mitm-proxy start --max-flows 50000
启动后输出:
Proxy listening on :8080 Web UI at http://localhost:8081 CA cert: /root/.mitm-proxy/ca.crt (install with: mitm-proxy cert install)
HTTPS 流量解密需要将 CA 证书加入系统信任库:
bash# 自动安装(推荐)
./bin/mitm-proxy cert install
# 查看证书路径
./bin/mitm-proxy cert export
# 输出:~/.mitm-proxy/ca.crt
也可以通过 Web UI 下载:访问 http://localhost:8081,点击工具栏中的 CA 按钮下载证书后手动导入。
手动导入:
macOS:
bashsecurity add-trusted-cert -d -r trustRoot \ -k /Library/Keychains/System.keychain \ ~/.mitm-proxy/ca.crt
Linux:
bashsudo cp ~/.mitm-proxy/ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
命令行(临时):
bashexport http_proxy=http://localhost:8080
export https_proxy=http://localhost:8080
curl https://example.com
浏览器: 在系统网络设置或浏览器代理设置中,将 HTTP/HTTPS 代理设置为 localhost:8080。
打开浏览器访问 http://localhost:8081,即可实时查看所有拦截到的流量。
┌──────────────────────────────────────────────────────────────┐ │ mitm-proxy │ [host] [method] [status] [Clear] [CA] N flows│ ├────────────────────┬─────────────────────────────────────────┤ │ 流量列表(左侧) │ 流量详情(右侧) │ │ │ Headers | Request | Response | Raw │ │ GET 200 /api/v1 │ │ │ POST 404 /login │ 请求头、响应头、Body、完整 JSON │ └────────────────────┴─────────────────────────────────────────┘
过滤栏:
工具栏按钮:
详情面板标签:
mitm-proxy start [flags] --proxy-port int 代理监听端口(默认:8080) --ui-port int Web UI 监听端口(默认:8081) --max-flows int 内存中保留的最大流量条数(默认:10000) mitm-proxy cert install 安装 CA 证书到系统信任库 mitm-proxy cert export 输出 CA 证书路径
| 端点 | 方法 | 说明 |
|---|---|---|
/api/flows | GET | 列出流量,支持过滤和分页 |
/api/flows | DELETE | 清空所有流量 |
/api/flows/{id} | GET | 获取单条流量详情 |
/api/cert | GET | 下载 CA 证书(PEM 格式) |
/api/status | GET | 获取代理状态 |
/api/ws | WebSocket | 实时接收新流量推送 |
过滤参数(GET /api/flows):
?host=example.com&method=GET&status=200&q=keyword&limit=50&offset=0
bashmake build # 编译前端 + Go 二进制
make web # 仅构建前端
make test # 运行测试
make clean # 清理构建产物
make docker # 构建 Docker 镜像
make docker-run # 运行 Docker 容器
~/.mitm-proxy/ ├── ca.crt # CA 证书(PEM 格式) └── ca.key # CA 私钥(权限 0600)
首次启动时自动生成,有效期 10 年。
在 iPhone/iPad 上抓包小程序或 App 请求,需要完成两步:设置 Wi-Fi 代理 + 安装 CA 证书。
前提: iOS 设备和运行 mitm-proxy 的电脑必须连接同一 Wi-Fi。
在电脑上查看本机局域网 IP:
bash# macOS
ipconfig getifaddr en0
# Linux
ip addr show | grep 'inet ' | grep -v 127.0.0.1
记下 IP,例如 192.168.1.100。
mitm-proxy 默认只监听 localhost,需要改为监听所有网卡,iOS 设备才能访问:
bash./bin/mitm-proxy start --proxy-addr 0.0.0.0:8080
如果
--proxy-addr不支持,可以用--proxy-port 8080,代理默认已绑定 0.0.0.0。
192.168.1.100(电脑局域网 IP)8080在 iOS Safari 中访问(必须用 Safari,其他浏览器无法触发安装):
http://192.168.1.100:8081
点击 Web UI 右上角 CA 按钮,Safari 会弹出"此网站正在尝试下载一个配置描述文件",点击允许,然后关闭。
iOS 安装证书后默认不信任,还需要手动开启 SSL 信任:
完成以上配置后,用 Safari 或目标 App 发起请求,在电脑浏览器打开 http://localhost:8081 即可看到 iOS 设备的流量。
本文作者:瓜儿爸
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!