# go-mitmproxy [English](./README.md) `go-mitmproxy` 是一个用 Golang 实现的 [mitmproxy](https://mitmproxy.org/),支持中间人攻击(Man-in-the-middle)并解析、监测、篡改 HTTP/HTTPS 流量。 ## 主要功能 - 解析 HTTP/HTTPS 流量,可通过 [WEB 界面](#web-界面)查看流量详情。 - 支持[插件机制](#通过开发插件添加功能),方便扩展自己需要的功能。多种事件 HOOK 可参考 [examples](./examples)。 - HTTPS 证书相关逻辑与 [mitmproxy](https://mitmproxy.org/) 兼容,并保存在 `~/.mitmproxy` 文件夹中。如果之前已经用过 `mitmproxy` 并安装信任了根证书,则 `go-mitmproxy` 可以直接使用。 - 更多功能请参考[配置文档](#更多参数)。 ## 暂未实现的功能 - 只支持客户端显示设置代理,不支持透明代理模式。 - 暂不支持 http/2 协议解析和 websocket 协议解析。 > 如需了解显示设置代理和透明代理模式的区别,请参考 Python 版本的 mitmproxy 文档:[How mitmproxy works](https://docs.mitmproxy.org/stable/concepts-howmitmproxyworks/)。`go-mitmproxy` 目前支持文中提到的『Explicit HTTP』和『Explicit HTTPS』。 ## 命令行工具 ### 安装 ```bash go install github.com/lqqyt2423/go-mitmproxy/cmd/go-mitmproxy@latest ``` ### 使用 使用以下命令启动 go-mitmproxy 代理服务器: ```bash go-mitmproxy ``` 启动后,HTTP 代理地址默认为 9080 端口,Web 界面默认在 9081 端口。 首次启动后需安装证书以解析 HTTPS 流量,证书会在首次启动命令后自动生成,路径为 `~/.mitmproxy/mitmproxy-ca-cert.pem`。安装步骤可参考 Python mitmproxy 文档:[About Certificates](https://docs.mitmproxy.org/stable/concepts-certificates/)。 ### 更多参数 可以使用以下命令查看 go-mitmproxy 的更多参数: ```bash go-mitmproxy -h ``` ```txt Usage of go-mitmproxy: -addr string 代理监听地址 (默认值为 ":9080") -allow_hosts []string HTTPS解析域名白名单 -cert_path string 生成证书文件路径 -debug int 调试模式:1-打印调试日志,2-显示调试来源 -f string 从文件名读取配置,传入json配置文件地址 -ignore_hosts value HTTPS解析域名黑名单 -ssl_insecure 不验证上游服务器的 SSL/TLS 证书 -version 显示 go-mitmproxy 版本 -web_addr string web 界面监听地址 (默认值为 ":9081") ``` ## 作为包引入开发功能 ### 简单示例 ```golang package main import ( "log" "github.com/lqqyt2423/go-mitmproxy/proxy" ) func main() { opts := &proxy.Options{ Addr: ":9080", StreamLargeBodies: 1024 * 1024 * 5, } p, err := proxy.NewProxy(opts) if err != nil { log.Fatal(err) } log.Fatal(p.Start()) } ``` ### 通过开发插件添加功能 参考示例 [examples](./examples),可通过自己实现 `AddAddon` 方法添加自己实现的插件。 下面列出目前支持的事件节点: ```golang type Addon interface { // 一个客户端已经连接到了mitmproxy。请注意,一个连接可能对应多个HTTP请求。 ClientConnected(*ClientConn) // 一个客户端连接已关闭(由我们或客户端关闭)。 ClientDisconnected(*ClientConn) // mitmproxy 已连接到服务器。 ServerConnected(*ConnContext) // 服务器连接已关闭(由我们或服务器关闭)。 ServerDisconnected(*ConnContext) // 与服务器的TLS握手已成功完成。 TlsEstablishedServer(*ConnContext) // HTTP请求头已成功读取。此时,请求体为空。 Requestheaders(*Flow) // 完整的HTTP请求已被读取。 Request(*Flow) // HTTP响应头已成功读取。此时,响应体为空。 Responseheaders(*Flow) // 完整的HTTP响应已被读取。 Response(*Flow) // 流式请求体修改器 StreamRequestModifier(*Flow, io.Reader) io.Reader // 流式响应体修改器 StreamResponseModifier(*Flow, io.Reader) io.Reader } ``` ## WEB 界面 你可以通过浏览器访问 http://localhost:9081/ 来使用 WEB 界面。 ### 功能点 - 查看 HTTP/HTTPS 请求的详细信息 - 支持对 JSON 请求/响应进行格式化预览 - 支持二进制模式查看响应体 - 支持高级的筛选过滤规则 - 支持请求断点功能 ### 截图示例 ![](./assets/web-1.png) ![](./assets/web-2.png) ![](./assets/web-3.png) ## License [MIT License](./LICENSE)