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