You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-mitmproxy/README_CN.md

165 lines
4.3 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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)