mitmproxy实战:从零搭建安卓模拟器抓包环境与证书配置详解

mitmproxy实战:从零搭建安卓模拟器抓包环境与证书配置详解 1. 为什么需要mitmproxy抓包环境作为一个经常和移动端打交道的开发者我遇到过太多需要分析网络请求的场景。比如调试API接口时明明服务端返回了数据但客户端就是显示不出来或者测试同学反馈某个页面加载特别慢但服务端日志又看不出异常。这时候如果能抓到客户端的真实请求问题往往就迎刃而解了。mitmproxy就像是一个透明的中间人它能拦截、查看甚至修改经过它的所有HTTP/HTTPS流量。相比Fiddler或Charles这些图形化工具mitmproxy最大的优势是支持命令行操作和脚本扩展。我去年做自动化测试时就用它写了个自动修改响应内容的脚本省去了大量手工操作。不过新手最头疼的往往是证书配置问题。记得我第一次尝试时模拟器死活不信任安装的CA证书折腾了大半天才发现是系统时间不对。所以这次我会把可能遇到的坑都列出来让你少走弯路。2. 环境准备安装mitmproxy2.1 选择适合的安装方式mitmproxy支持多种安装方式我最推荐用Python的pip安装pip install mitmproxy这会把三个核心工具一次性装好mitmproxy交互式控制台界面mitmdump命令行版本适合脚本化操作mitmweb基于Web的图形界面如果你遇到权限问题可以加上--user参数。我在Windows和Mac上都实测过安装过程基本不会出问题。唯一要注意的是Python版本最好在3.6以上去年有个同事用Python2.7安装就报了一堆兼容性错误。2.2 验证安装是否成功安装完成后试试运行mitmdump --version如果看到版本号输出比如我当前是9.0.1说明安装成功。第一次运行可能会提示缺少依赖按照提示安装即可。有个小技巧在Linux系统下你可以用alias mpmitmproxy设置个快捷命令以后输入mp就能启动。3. 安卓模拟器配置详解3.1 模拟器选型与基础设置虽然官方文档推荐用Android Studio自带的模拟器但我实测下来夜神模拟器对抓包更友好。特别是它的海外版没有广告运行也更稳定。创建模拟器时要注意三个关键点安卓版本选择建议用Android 7.0以上版本太老的系统如4.4对证书管理不完善开启Root权限在模拟器设置中找到超级用户权限并启用网络模式选择一定要选桥接模式这样模拟器会和主机在同一个局域网有个容易忽略的细节是分辨率设置。我习惯用1080x1920的手机比例这样抓包时看到的User-Agent更接近真实设备。如果你主要测试平板应用可以调整对应的分辨率。3.2 网络代理配置实战首先在主机上查IP地址# Windows ipconfig # Mac/Linux ifconfig找到以太网或Wi-Fi的IPv4地址比如192.168.1.100。然后在模拟器的Wi-Fi设置中长按当前网络选择修改网络选择手动代理主机名填刚才查到的IP端口填mitmproxy的监听端口默认8080这里有个常见坑点如果主机开了VPN可能会导致IP地址识别错误。我有次就因为这个配置了半天没通后来关掉VPN立即就好了。如果连接后模拟器无法上网可以试试ping主机的IP检查网络是否真的连通。4. 证书安装全流程指南4.1 启动mitmproxy并下载证书先启动mitmdump监听mitmdump -p 8888在模拟器浏览器访问mitm.it你会看到一个彩色页面。点击Android图标下载证书这个站点是mitmproxy官方提供的专门用于证书分发。如果页面打不开可能是代理没配好回去检查上一步的网络设置。4.2 安装证书到系统信任区下载的证书文件通常叫mitmproxy-ca-cert.cer。安装时需要特别注意在设置中找到安全-加密与凭据选择从存储设备安装找到下载的证书文件命名证书比如mitmproxy选择用途为VPN和应用安卓7.0之后有个重要变化用户安装的证书默认不信任应用流量。这时需要额外操作# 将证书移动到系统分区 adb root adb remount adb push mitmproxy-ca-cert.cer /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/mitmproxy-ca-cert.cer4.3 验证证书是否生效打开模拟器的浏览器访问https网站应该不再有证书警告。如果想更彻底地验证可以用这个命令检查adb shell su -c cat /data/misc/user/0/cacerts-added/* | openssl x509 -noout -subject如果看到输出中包含mitmproxy说明证书已正确安装。我遇到过证书安装成功但依然报错的情况后来发现是系统时间不对——证书有效期检查失败也会导致这个问题。5. 抓包实战技巧与问题排查5.1 常用mitmproxy命令参数除了基本监听mitmproxy还支持很多实用参数# 只记录特定域名的请求 mitmdump -p 8080 -s filter_script.py # 屏蔽控制台冗余输出 mitmdump -q # 限制处理请求的大小防止大文件卡死 mitmdump --set body-size-limit10k我常用的过滤脚本示例def request(flow): if api.example.com not in flow.request.host: flow.kill()5.2 常见问题解决方案问题1模拟器能上网但抓不到包检查防火墙是否放行了mitmproxy的端口确认模拟器代理设置正确试试adb logcat | grep Proxy看是否有错误日志问题2HTTPS网站显示证书无效确认证书安装到了系统区而不仅是用户区检查系统日期时间是否正确尝试重启模拟器问题3某些应用依然无法抓包这些应用可能使用了证书固定Certificate Pinning可以试试JustTrustMe模块需要Xposed框架或者修改APK文件去掉证书校验逻辑6. 高阶应用场景6.1 流量重放与Mock测试mitmproxy的强大之处在于可以动态修改请求。比如这个脚本会把所有请求的User-Agent改成自定义值def request(flow): flow.request.headers[User-Agent] My-Custom-Agent更实用的场景是接口Mockfrom mitmproxy import http def response(flow: http.HTTPFlow): if /api/user in flow.request.path: flow.response http.Response.make( 200, b{name: Mock User}, {Content-Type: application/json} )6.2 性能分析与统计通过脚本可以自动统计请求耗时durations [] def response(flow): durations.append(flow.response.timestamp_end - flow.request.timestamp_start) print(f平均响应时间: {sum(durations)/len(durations):.2f}s)这个数据对性能优化特别有用。上个月我就用类似脚本发现某个图片接口平均要加载2.3秒优化后降到了0.4秒。7. 安全注意事项虽然mitmproxy很强大但使用时要注意不要在生产环境长期开启代理定期更新mitmproxy版本旧版可能有安全漏洞用完后及时移除模拟器的代理设置敏感数据抓包建议在隔离的测试环境进行我习惯在每次使用后执行# 清除所有捕获的数据 mitmdump --anticache # 关闭代理服务 pkill mitmdump