1. 认识mitmproxy你的网络调试瑞士军刀第一次听说mitmproxy时你可能觉得这是个复杂的安全工具。但实际用过后就会发现它就像网络调试领域的瑞士军刀能解决各种数据抓包难题。简单来说mitmproxy是个开源的交互式中间人代理工具支持HTTP/HTTPS流量拦截和修改。与Fiddler、Charles等商业工具不同它完全免费且支持命令行操作特别适合开发者进行自动化测试。我在实际项目中经常用它来做这些事情调试移动端API请求分析第三方服务的数据格式模拟网络异常场景自动化修改请求/响应内容它的核心优势在于可编程性——你可以用Python编写脚本来处理流量。比如上周我帮客户分析一个电商APP时就用mitmproxy自动记录了所有商品详情页的API调用省去了手动抓包的时间。2. 环境搭建跨平台安装指南2.1 基础安装步骤无论你用什么操作系统安装mitmproxy都只需要一条命令。我推荐使用Python的pip工具安装这样能自动处理所有依赖pip install mitmproxy安装完成后你会获得三个核心工具mitmproxy交互式终端界面mitmdump命令行版本我最常用的mitmweb基于浏览器的可视化界面验证安装是否成功可以运行mitmdump --version注意如果遇到权限问题建议使用虚拟环境。我习惯用venv创建隔离环境python -m venv mitm-env source mitm-env/bin/activate # Linux/Mac ./mitm-env/Scripts/activate # Windows2.2 解决常见安装问题新手常会遇到这几个坑OpenSSL版本冲突在Mac上可能遇到建议用brew先升级openssl代理端口占用默认8080端口被占用时用-p指定新端口防火墙拦截记得放行mitmproxy的入站连接上周有个同事在Windows上安装失败最后发现是PATH环境变量没配置。这里分享我的万能解决方案python -m pip install --user mitmproxy set PATH%APPDATA%\Python\Python39\Scripts;%PATH%3. 证书配置HTTPS抓包的关键3.1 生成和导出证书不安装证书的话mitmproxy只能看到HTTPS流量的乱码。安装后首次运行mitmproxy时它会自动在用户目录生成证书mitmdump证书文件默认存放在Linux/Mac:~/.mitmproxyWindows:C:\Users\用户名\.mitmproxy重要证书文件说明文件格式适用场景mitmproxy-ca.pem原始PEM格式私钥mitmproxy-ca-cert.pem通用证书文件mitmproxy-ca-cert.p12Windows专用mitmproxy-ca-cert.cerAndroid备用格式3.2 各平台证书安装指南Windows系统双击mitmproxy-ca-cert.p12选择本地计算机存储位置选择将所有证书放入下列存储浏览选择受信任的根证书颁发机构Mac系统特殊设置除了钥匙串中设置始终信任外还需要执行sudo security add-trusted-cert -d -p ssl -p basic -k /Library/Keychains/System.keychain ~/.mitmproxy/mitmproxy-ca-cert.pemiOS设备最新配置用Safari访问mitm.itmitmproxy提供的证书下载页安装描述文件后进入设置 通用 VPN与设备管理点击安装的企业级应用最后在关于本机底部开启完全信任4. 实战抓包从基础到高级技巧4.1 基础代理设置启动代理服务建议用这个命令组合mitmdump -p 8888 --ssl-insecure手机端设置要注意确保电脑和手机在同一局域网手动设置WiFi代理服务器电脑的内网IPifconfig/ipconfig查看端口8888或你指定的端口测试时遇到连接问题可以先用ping检查网络连通性。我常用的诊断步骤是手机浏览器访问mitm.it查看能否显示证书安装页面尝试访问http站点确认基础代理生效再测试HTTPS站点4.2 高级过滤技巧直接抓所有流量会太杂乱我常用这些过滤参数mitmdump -p 8888 --ignore-hosts ^.*\.google\.com$ -s filter_script.pyfilter_script.py示例def request(flow): if api/v3/user in flow.request.url: print(f捕获用户API请求: {flow.request.method} {flow.request.url}) with open(user_requests.log, a) as f: f.write(f{flow.request.headers}\n{flow.request.text}\n\n)更复杂的多条件过滤可以用def response(flow): if (flow.response.status_code 200 and application/json in flow.response.headers[content-type] and secret_key in flow.response.text): ctx.log.alert(发现敏感数据)5. 移动端抓包专项指南5.1 Android真机调试除了常规证书安装还需要注意安卓7需要修改APP的networkSecurityConfig部分APP会启用证书固定Certificate Pinning使用Magisk模块可以绕过大部分限制我常用的adb命令快速安装证书adb push ~/.mitmproxy/mitmproxy-ca-cert.cer /sdcard/ adb shell am start -a android.intent.action.VIEW \ -t application/x-x509-ca-cert \ -d file:///sdcard/mitmproxy-ca-cert.cer5.2 特殊场景处理遇到抓不到包的情况可以尝试关闭IPv6mitmdump -p 8888 --no-http2禁用缓存添加--set block_globalfalse模拟低速网络--set connection_strategylazy对于顽固的APP终极解决方案是使用frida脚本绕过SSL校验Java.perform(function() { var Certificate Java.use(java.security.cert.Certificate); var X509Certificate Java.use(java.security.cert.X509Certificate); // 绕过证书验证逻辑... });6. 数据分析和自动化实战6.1 流量统计分析用这个脚本可以生成简易流量报表from collections import defaultdict class TrafficAnalyzer: def __init__(self): self.host_stats defaultdict(int) def response(self, flow): host flow.request.host self.host_stats[host] len(flow.response.content) print(f\n当前流量统计:) for host, size in sorted(self.host_stats.items(), keylambda x: -x[1]): print(f{host}: {size/1024:.2f}KB) addons [TrafficAnalyzer()]6.2 自动化测试集成将mitmproxy与pytest结合的例子import pytest from mitmproxy.tools.main import mitmdump pytest.fixture(scopemodule) def proxy_server(): process mitmdump([-p, 9080, -s, mock_server.py]) yield process.terminate() def test_with_proxy(proxy_server): # 测试代码使用本地9080端口作为代理 pass最近帮客户做的一个电商爬虫项目中我们用这套方案成功实现了自动识别反爬机制动态修改请求参数模拟用户行为序列异常请求自动重试7. 安全防护与性能优化7.1 安全使用建议虽然mitmproxy很强大但使用不当会有风险不要在生产环境长期运行定期清理.mitmproxy目录下的证书使用完后及时关闭代理服务敏感数据记得加密存储我习惯在脚本开头添加安全校验if os.getenv(MITM_SAFE_MODE) ! true: raise RuntimeError(安全模式未启用拒绝启动)7.2 性能调优技巧处理高并发流量时这些参数很关键mitmdump --set stream_large_bodies1m \ --set proxy_debugfalse \ --set keep_host_headertrue \ --listen-port 8890内存优化配置示例def load(self, loader): loader.add_option( body_size_limit, str, 10m, 请求体大小限制 )在最近一次压力测试中通过调整这些参数我们成功将单机代理性能从800QPS提升到了3500QPS。关键点在于禁用不必要的日志合理设置缓冲区大小启用流式传输大文件优化正则匹配规则
mitmproxy实战:从环境搭建到HTTPS抓包全攻略
发布时间:2026/6/16 2:50:23
1. 认识mitmproxy你的网络调试瑞士军刀第一次听说mitmproxy时你可能觉得这是个复杂的安全工具。但实际用过后就会发现它就像网络调试领域的瑞士军刀能解决各种数据抓包难题。简单来说mitmproxy是个开源的交互式中间人代理工具支持HTTP/HTTPS流量拦截和修改。与Fiddler、Charles等商业工具不同它完全免费且支持命令行操作特别适合开发者进行自动化测试。我在实际项目中经常用它来做这些事情调试移动端API请求分析第三方服务的数据格式模拟网络异常场景自动化修改请求/响应内容它的核心优势在于可编程性——你可以用Python编写脚本来处理流量。比如上周我帮客户分析一个电商APP时就用mitmproxy自动记录了所有商品详情页的API调用省去了手动抓包的时间。2. 环境搭建跨平台安装指南2.1 基础安装步骤无论你用什么操作系统安装mitmproxy都只需要一条命令。我推荐使用Python的pip工具安装这样能自动处理所有依赖pip install mitmproxy安装完成后你会获得三个核心工具mitmproxy交互式终端界面mitmdump命令行版本我最常用的mitmweb基于浏览器的可视化界面验证安装是否成功可以运行mitmdump --version注意如果遇到权限问题建议使用虚拟环境。我习惯用venv创建隔离环境python -m venv mitm-env source mitm-env/bin/activate # Linux/Mac ./mitm-env/Scripts/activate # Windows2.2 解决常见安装问题新手常会遇到这几个坑OpenSSL版本冲突在Mac上可能遇到建议用brew先升级openssl代理端口占用默认8080端口被占用时用-p指定新端口防火墙拦截记得放行mitmproxy的入站连接上周有个同事在Windows上安装失败最后发现是PATH环境变量没配置。这里分享我的万能解决方案python -m pip install --user mitmproxy set PATH%APPDATA%\Python\Python39\Scripts;%PATH%3. 证书配置HTTPS抓包的关键3.1 生成和导出证书不安装证书的话mitmproxy只能看到HTTPS流量的乱码。安装后首次运行mitmproxy时它会自动在用户目录生成证书mitmdump证书文件默认存放在Linux/Mac:~/.mitmproxyWindows:C:\Users\用户名\.mitmproxy重要证书文件说明文件格式适用场景mitmproxy-ca.pem原始PEM格式私钥mitmproxy-ca-cert.pem通用证书文件mitmproxy-ca-cert.p12Windows专用mitmproxy-ca-cert.cerAndroid备用格式3.2 各平台证书安装指南Windows系统双击mitmproxy-ca-cert.p12选择本地计算机存储位置选择将所有证书放入下列存储浏览选择受信任的根证书颁发机构Mac系统特殊设置除了钥匙串中设置始终信任外还需要执行sudo security add-trusted-cert -d -p ssl -p basic -k /Library/Keychains/System.keychain ~/.mitmproxy/mitmproxy-ca-cert.pemiOS设备最新配置用Safari访问mitm.itmitmproxy提供的证书下载页安装描述文件后进入设置 通用 VPN与设备管理点击安装的企业级应用最后在关于本机底部开启完全信任4. 实战抓包从基础到高级技巧4.1 基础代理设置启动代理服务建议用这个命令组合mitmdump -p 8888 --ssl-insecure手机端设置要注意确保电脑和手机在同一局域网手动设置WiFi代理服务器电脑的内网IPifconfig/ipconfig查看端口8888或你指定的端口测试时遇到连接问题可以先用ping检查网络连通性。我常用的诊断步骤是手机浏览器访问mitm.it查看能否显示证书安装页面尝试访问http站点确认基础代理生效再测试HTTPS站点4.2 高级过滤技巧直接抓所有流量会太杂乱我常用这些过滤参数mitmdump -p 8888 --ignore-hosts ^.*\.google\.com$ -s filter_script.pyfilter_script.py示例def request(flow): if api/v3/user in flow.request.url: print(f捕获用户API请求: {flow.request.method} {flow.request.url}) with open(user_requests.log, a) as f: f.write(f{flow.request.headers}\n{flow.request.text}\n\n)更复杂的多条件过滤可以用def response(flow): if (flow.response.status_code 200 and application/json in flow.response.headers[content-type] and secret_key in flow.response.text): ctx.log.alert(发现敏感数据)5. 移动端抓包专项指南5.1 Android真机调试除了常规证书安装还需要注意安卓7需要修改APP的networkSecurityConfig部分APP会启用证书固定Certificate Pinning使用Magisk模块可以绕过大部分限制我常用的adb命令快速安装证书adb push ~/.mitmproxy/mitmproxy-ca-cert.cer /sdcard/ adb shell am start -a android.intent.action.VIEW \ -t application/x-x509-ca-cert \ -d file:///sdcard/mitmproxy-ca-cert.cer5.2 特殊场景处理遇到抓不到包的情况可以尝试关闭IPv6mitmdump -p 8888 --no-http2禁用缓存添加--set block_globalfalse模拟低速网络--set connection_strategylazy对于顽固的APP终极解决方案是使用frida脚本绕过SSL校验Java.perform(function() { var Certificate Java.use(java.security.cert.Certificate); var X509Certificate Java.use(java.security.cert.X509Certificate); // 绕过证书验证逻辑... });6. 数据分析和自动化实战6.1 流量统计分析用这个脚本可以生成简易流量报表from collections import defaultdict class TrafficAnalyzer: def __init__(self): self.host_stats defaultdict(int) def response(self, flow): host flow.request.host self.host_stats[host] len(flow.response.content) print(f\n当前流量统计:) for host, size in sorted(self.host_stats.items(), keylambda x: -x[1]): print(f{host}: {size/1024:.2f}KB) addons [TrafficAnalyzer()]6.2 自动化测试集成将mitmproxy与pytest结合的例子import pytest from mitmproxy.tools.main import mitmdump pytest.fixture(scopemodule) def proxy_server(): process mitmdump([-p, 9080, -s, mock_server.py]) yield process.terminate() def test_with_proxy(proxy_server): # 测试代码使用本地9080端口作为代理 pass最近帮客户做的一个电商爬虫项目中我们用这套方案成功实现了自动识别反爬机制动态修改请求参数模拟用户行为序列异常请求自动重试7. 安全防护与性能优化7.1 安全使用建议虽然mitmproxy很强大但使用不当会有风险不要在生产环境长期运行定期清理.mitmproxy目录下的证书使用完后及时关闭代理服务敏感数据记得加密存储我习惯在脚本开头添加安全校验if os.getenv(MITM_SAFE_MODE) ! true: raise RuntimeError(安全模式未启用拒绝启动)7.2 性能调优技巧处理高并发流量时这些参数很关键mitmdump --set stream_large_bodies1m \ --set proxy_debugfalse \ --set keep_host_headertrue \ --listen-port 8890内存优化配置示例def load(self, loader): loader.add_option( body_size_limit, str, 10m, 请求体大小限制 )在最近一次压力测试中通过调整这些参数我们成功将单机代理性能从800QPS提升到了3500QPS。关键点在于禁用不必要的日志合理设置缓冲区大小启用流式传输大文件优化正则匹配规则