一个轻量级、开发者友好的中间人(MITM)HTTP/HTTPS 代理,使用 Go 编写。它支持 HTTP/1.1 和 HTTP/2、CONNECT 隧道、WebSocket 隧道(ws/wss)、带有灵活过滤器的磁盘响应缓存以及实时配置重载。

Go MITM Proxy 是一个拦截代理,用于调试、测试、学习和受控拦截 HTTP(S) 流量。当启用 MITM 时,它会动态生成由本地 CA 签名的每主机叶子证书,从而允许代理解密和检查 HTTPS 流量。当 MITM 禁用或针对排除的域名/端口时,它也可以作为透明 TCP 隧道工作。
重要提示: 此应用程序会执行主动的中间人(MITM)拦截,包括生成和使用 TLS 证书来解密 HTTPS 流量。根据您所在的司法管辖区和网络环境,在未获得所有受影响用户明确、事先同意的情况下拦截流量可能属于违法行为,并可能违反隐私、工作场所政策或监管要求。
在使用此软件除您本地机器以外的任何环境之前:
此代理可能拦截流量的任何网络上的所有用户必须明确告知将会发生 HTTP(S) 拦截和检查。同意应是明确的,并最好有书面记录。
请勿在您不拥有、不管理或未获得明确授权进行测试或监控的网络上运行此软件。
许多地区对用户数据的拦截、记录和存储有严格的法律规定(例如 GDPR、CCPA、窃听法)。您有责任确保您的使用符合所有适用法规。
生成的 CA 私钥(通常为 ca-key.pem)允许持有者冒充信任相应证书的用户中的任何域名。
此代理设计用于开发、调试、受控测试或教育目的 — 并非用于隐蔽监控或未经授权的监视。
使用此软件即表示您承认并承担全部责任,确保您的使用合法、合乎道德,并已适当告知所有受影响的用户。
Via 和自定义 x-<normalized-proxy-name>-uid 头部)config.json 轮询和热应用更改先决条件:
克隆并构建: ```bash git clone https://github.com/Welfordian/mitm-proxy.git cd mitm-proxy go build ./
这会在项目根目录生成一个 mitm-proxy(在 Windows 上为 mitm-proxy.exe)二进制文件。
## 快速开始
1) 使用默认设置运行代理(监听在 :8080): ```bash
./mitm-proxy
在首次启动时,将创建本地CA并保存到 ca-cert.pem 和 ca-key.pem。
将您的浏览器或 curl 配置为使用位于 http://localhost:8080 的代理。
在您的操作系统/浏览器中信任生成的CA证书(ca-cert.pem),以允许HTTPS拦截。请参阅信任本地CA。
通过代理访问HTTPS站点并观察日志。使用详细模式获取更多信息: ```bash ./mitm-proxy --verbose
## 用法
### 命令行标志
- --config string: 指向 config.json 文件的路径
- --listen string: 监听地址(覆盖配置)
- --ca-cert string: 现有 CA 证书的路径(覆盖配置)
- --ca-key string: 现有 CA 密钥的路径(覆盖配置)
- --mitm bool: 启用 MITM 拦截(默认为 true;设为 false 则强制隧道)
- --verbose bool: 启用详细日志记录
- --watch-config bool: 监视 config.json 文件变化并自动应用(默认为 true)
- --admin-enabled bool: 启用本地管理 API/仪表盘(默认为 true)
- --admin-addr string: 管理 API/仪表盘监听地址(默认 127.0.0.1:9090)
- --admin-token string: 管理 bearer 令牌(若省略则在启动时生成)
- --admin-read-token string: 仅用于 GET/HEAD/OPTIONS 管理访问的只读 bearer 令牌
- --admin-ui bool: 提供内嵌管理 UI(默认为 true)
- --admin-store string: 管理 SQLite 存储路径(默认为 dashboard.db)
CLI 标志在注明时覆盖配置文件的值。
### 配置 (config.json)
仓库中提供了一个示例 config.json 文件: ```json
{
"listen_addr": ":8080",
"proxy_name": "MITM-Proxy",
"ca_cert_path": null,
"ca_key_path": null,
"ca_cert_output_path": "ca-cert.pem",
"ca_key_output_path": "ca-key.pem",
"enable_mitm": true,
"admin_enabled": true,
"admin_addr": "127.0.0.1:9090",
"admin_token": "",
"admin_read_token": "",
"admin_ui": true,
"admin_store": "dashboard.db",
"excluded_domains": [],
"blocked_ports": [25, 445, 3389],
"blocked_domains": [],
"blocked_ips": [],
"block_action": "deny",
"block_response_status": 403,
"traffic_capture": {
"store_bodies": false,
"max_body_bytes": 32768,
"redact_bodies": true,
"store_headers": true,
"redacted_headers": ["Authorization", "Cookie", "Proxy-Authorization", "Set-Cookie", "X-Api-Key"],
"store_cookies": true,
"redacted_cookies": []
},
"proxy_auth": {
"enabled": false,
"realm": "MITM Proxy",
"require_auth_for_loopback": false,
"default_action": "allow"
},
"verbose_logging": true,
"log_requests": true,
"max_idle_conns": 200,
"idle_conn_timeout_seconds": 90,
"tls_handshake_timeout_seconds": 10,
"min_tls_version": "1.2",
"tls_next_protos": ["h2", "http/1.1"],
"cache": {
"enabled": true,
"directory": "/var/cache/mitm-proxy",
"include_domains": [],
"exclude_domains": [],
"include_extensions": ["jpg", "png", "webp", "css", "js"],
"exclude_extensions": [],
"ttl": 3600
}
}
注:
ca_cert_path 或 ca_key_path,代理会将生成的 CA 写入 ca-cert.pem 和 ca-key.pem。excluded_domains 支持通配符(参见 internal/config 中的 IsDomainExcluded)。admin_addr 默认值为 localhost。如果 admin_token 为空,则在启动时生成并打印一个每次运行不同的令牌。admin_read_token 用于只读仪表盘/API 客户端。traffic_capture.store_bodies 默认禁用;启用后,请求体示例将受到大小限制并默认进行脱敏处理。traffic_capture.store_headers 和 traffic_capture.store_cookies 控制是否持久化捕获的元数据。redacted_headers 会脱敏整个标头值,而 redacted_cookies 则在存储前匹配并脱敏单个 Cookie 和 Set-Cookie 名称。proxy_auth 启用基于 SQLite 管理用户和有序 ACL 规则的基本客户端代理身份验证。blocked_domains 支持精确域名和通配符模式(如 *.example.com);blocked_ips 支持单个 IP 和 CIDR 范围。cache.include_domains 与 cache.exclude_domains 互斥,include_extensions 与 exclude_extensions 同理。--config 指定的文件或默认的 ./config.json,并通过 Proxy.SetConfig 热应用更改。管理服务器默认在 http://127.0.0.1:9090/admin/ 中提供仪表盘。API 路由需要 Authorization: Bearer <token>;对于本地浏览器使用,/admin/?token=<token> 会将令牌存储到浏览器本地存储中。
初始仪表盘/API 覆盖范围包括:
GET /api/health 和 GET /api/versionGET /api/auditGET /api/traffic、GET /api/traffic/stats、GET /api/traffic/{id}、GET /api/traffic/stream、DELETE /api/traffic 和 POST /api/traffic/{id}/replayGET /api/traffic/export?format=har 用于 HAR 格式导出GET/POST/PUT/DELETE /api/repeater/cases 和 POST /api/repeater/cases/{id}/send 用于保存的可编辑重放用例GET/POST/PUT/DELETE /api/scopes 以及用于流量和重放用例的作用域分配端点GET/POST/DELETE /api/pentest/maps 以及用于被动目标映射的端点克隆操作GET/POST/PUT/DELETE /api/proxy-auth/users 和 /api/proxy-acl/rules 以及 POST /api/proxy-acl/test 用于代理客户端访问控制POST /api/ai/traffic/{id}/explain、POST /api/ai/traffic/{id}/suggest-tests、POST /api/ai/repeater/cases/{id}/suggest-tests、POST /api/ai/repeater/cases/{id}/compare-runs 和 GET/POST/DELETE /api/ai/notes 用于 AI 研究助手笔记GET /api/certificates/ca、GET /api/certificates/ca/download、POST /api/certificates/ca/rotate、POST /api/certificates/ca/import 和 GET /api/certificates/leafGET/POST/DELETE 阻止规则GET /api/deployments/current、POST /api/deployments/current/reload、GET /api/logs、GET /api/cache(含缓存条目和命中/未命中计数)、POST /api/cache/purge 和 GET/PUT /api/settingsGET /api/threats/events、GET /api/threats/stream、GET /api/threats/config、POST /api/threats/test 及威胁覆盖端点GET /metrics 用于 Prometheus 兼容的进程/管理/威胁计数器仪表盘包含首次运行时的负责任使用确认。CA 私钥绝不会通过管理 API 暴露。
仪表盘状态默认存储于 SQLite 数据库 dashboard.db 中。通过仪表盘更改的设置会立即生效,并写回已配置的 JSON 文件;若代理从默认设置启动,则写回 config.json。
管理前端是一个位于 internal/admin/ui 的 Vite/React 应用。其生产构建输出到 internal/admin/ui/dist,并嵌入到 Go 二进制文件中。要更新仪表盘资源:```bash
cd internal/admin/ui
npm install
npm run build
### 上游代理链
出站流量可通过上游 HTTP 或 HTTPS 代理进行链式传递,例如 Burp、ZAP 或企业出口代理。启用后,正常的 HTTP(S) 转发、CONNECT 直通隧道、WebSocket 以及 Repeater 发送都将使用此上游代理,除非目标主机匹配 `no_proxy`。```json
{
"upstream_proxy": {
"enabled": true,
"url": "http://127.0.0.1:8080",
"username": "",
"password_env": "UPSTREAM_PROXY_PASSWORD",
"no_proxy": ["localhost", "127.0.0.1", "*.internal"],
"chain_tunnels": true,
"apply_to_repeater": true
}
}
v1 仅支持 http:// 和 https:// 上游代理 URL。如果需要 Basic 认证,请设置 username 并通过命名的环境变量提供密码;嵌入在 URL 中的凭据会被拒绝且永远不会显示在仪表盘设置中。如果启用了上游代理但不可用,受影响的请求会显式失败,而不会静默回退到直连。
仪表盘的 访问控制 视图管理客户端代理用户和按顺序排列的允许/拒绝 ACL 规则。代理用户存储在 SQLite 中并带有 bcrypt 密码哈希;仅当创建或重置用户时才接受明文密码,且 API 永远不会返回它们。