Mitmproxy 转发 Http 请求到 Https

我是从实习的时候开始使用 Mitmproxy 的,当时是为了 Debug APP 的 bug 才使用的。编写一个 python 小脚本将流量都转发到自己的 Server 上,对接口进行 Debug。

mitmproxy 叫做 man in the middle proxy,就是中间人代理的意思,一般的中间人攻击就可以利用这个软件,相似的软件还有 Burp Suite,是一个收费的软件,进官网下载免费版的就可以使用,有图形用户界面,功能也是相当强大,因为使用 Java 编写开发,有很好的跨平台能力。Windows 平台上有 Fiddler,功能也是很强大,不多说直接进入今天的正题。

环境介绍

一般开发有三种服务器,dev,beta,online。Android,iOS 发 Build 包一般都会指向测试服务器,但是你要做开发,或者 Debug 就要指向自己服务器,或者是线上服务器,不能总是麻烦他们,所以这时就需要一个代理来转发请求。

online 一般都是 Https,所以对于 https 还要做一些其他处理。

安装一个 Mitmproxy

不管是是什么平台只要安装好 python-pip,就可以直接安装 Mitmproxy

1
pip install mitmproxy

mitmproxy 会在~/.mitmproxy 目录下生成一个 mitmproxy-ca-cert.pem 证书。如果是对端开发,支持 https 就要安装自签证书。

1
python -m SimpleHTTPServer 8888

手机访问 http://ip:8888 安装证书

1
mitmproxy -p 3128

手机设置代理到 ip:3128,此时就能抓到 https 的数据包了。

自签证书

1
2
3
openssl genrsa -out cert.key 2048
openssl req -new -x509 -key cert.key -out cert.crt
cat cert.key cert.crt > cert.pem

运行

1
mitmproxy -p 3128 --cert=cert.pem

Script 支持

转发一定少不了脚本支持

Example

1
2
3
4
5
6
def request(context, flow):
if 'www.baidu.com' == flow.request.hots:
if flow.request.scheme == 'https':
flow.request.scheme = 'https'
flow.request.host = 'blog.ibeats.top'
flow.request.prot = 443

运行

1
mitmproxy -s forward.py -p 3128

帮助文档

官方文档官方 script