如何查看自己移动应用的流量:mitmproxy和Charles分步指南
你正在开发或测试移动应用,想确切知道它向服务器发送了哪些请求以及收到了什么响应?本分步指南将带你从零开始,直至完全掌控自己应用的网络流量。我们将解析2026年最流行的工具,学习如何在手机、模拟器上安装受信任的证书,并通过标准手段在调试版本中优雅地绕过SSL pinning。
从一开始就要明确:以下所有内容仅适用于你自己的应用,或你已获得所有者书面授权研究其流量。本文面向质量工程师和开发者,而非教人干预他人程序的教程。我们将在关于规则和道德的章节中详细讨论这一点。
引言:为什么开发者和测试人员要查看自己应用的流量
移动应用与服务器持续通信:登录、拉取商品目录、发送分析数据、同步信息。一切正常时,这些请求不可见。但一旦出问题,问题就变成:到底发送了什么到服务器,又返回了什么?
学会读取自己应用的流量能解决多个问题:
- 验证集成。你能看到向API发出的精确请求格式、头部、主体和响应码。很容易判断bug出在客户端还是后端。
- 复现bug。测试人员报告问题时,你可以查看实际的请求序列并重现场景。
- 审计泄漏。检查是否泄露了不应外传的内容:日志中的令牌、分析数据中的个人信息、多余的字段。
- 测试错误场景。可以篡改服务器响应,观察应用在500错误或超时时的行为。
最终你能获得什么
完成本指南后,你将能在电脑上搭建本地代理,通过它转发手机的流量,解密HTTPS请求,在便捷的界面中阅读、重放甚至篡改响应。这一切都针对你自己的应用。
本指南适合谁
本文面向QA工程师、移动开发者以及希望深入了解自己应用网络层的技术人员。难度:适合初学者,但也包含进阶内容。
你需要提前了解什么
具备HTTP请求、服务器和客户端的基础概念即可。了解命令行是加分项,但我们也会讲解图形化工具。不需要深入的密码学知识。
需要多长时间
首次配置大约需要1到2小时,包括安装工具和证书。后续启动只需几分钟。
前期准备:工具、要求和安装步骤
在深入流量之前,我们先搭建工作环境。分析四种流行工具,并选出最适合你的那一款。
工具对比:mitmproxy、Charles、Proxyman和Burp Suite
这些工具都能作为MITM代理工作,即放置在应用与服务器之间的中间人。区别在于界面、价格和易用性。
- mitmproxy。免费且开源。运行于终端,但也提供Web界面mitmweb。适合喜欢脚本和Python自动化的人。跨平台。
- Charles。付费,有试用期。经典的Java图形界面,支持Windows、macOS和Linux。以其简便性广受移动QA欢迎。
- Proxyman。现代化工具,界面美观,最初为macOS开发,现在也有Windows和Linux版本。方便的自动证书配置。
- Burp Suite。来自安全领域的工具。功能强大,有免费的Community版本。对于简单查看流量略显臃肿,但对进阶分析很有用。
建议:如果你是新手,想快速看到结果,可以从Charles或Proxyman开始。如果你喜欢终端和自动化,选择mitmproxy。本指南将重点放在mitmproxy和Charles上,因为它们最通用。
系统要求
- 一台Windows、macOS或Linux电脑,具有管理员权限。
- 一台Android或iOS设备、模拟器或仿真器。
- 手机和电脑处于同一Wi-Fi网络,或配置好的模拟器。
- 能访问你应用的源代码,以便编译调试版本。
需要下载和安装什么
- 从官方渠道下载选定的代理工具。对于mitmproxy,下载对应操作系统的安装包或用包管理器安装。
- 按照系统标准安装流程进行安装。
- 对于Android模拟器,安装Android Studio,并选择不含Google服务的系统镜像,以便轻松操作系统证书存储。
- 对于macOS上的iOS仿真器,从App Store安装Xcode。
⚠️ 注意:仅从开发者官方网站下载工具。代理程序深度访问流量,假冒版本可能很危险。尽可能验证安装包的签名。
备份和设备准备
证书和网络设置的操作通常是安全的且可逆的。但修改前还是应该做点准备。
- 记下手机当前的Wi-Fi设置,以便事后恢复。
- 使用单独的测试设备或配置文件进行实验,而不是主力工作手机。
- 如果使用工作设备,记住安装了哪些证书,调试结束后及时删除。
✅ 检查:此阶段,你应已安装代理工具,准备好测试设备或模拟器,并能访问自己应用的构建版本。
基本概念:MITM代理如何工作,为什么需要自己的证书
为了顺利推进,我们先简单解释关键术语。这是基础,否则后续步骤会显得像魔法。
什么是MITM代理
MITM代表中间人攻击。代理位于你应用和服务器之间。应用以为自己在和服务器通信,服务器以为自己在和应用的客户端通信,但实际上两者都在和代理通信,代理能看到全部流量。
对于普通HTTP,这立竿见影:数据以明文传输。但现代应用使用HTTPS,流量是加密的。这时有趣的事情就开始了。
TLS握手时发生了什么
HTTPS基于TLS协议。当应用连接到服务器时,它们执行所谓的TLS握手。服务器出示自己的证书,证明它是其所声称的一方。应用根据受信任的证书颁发机构列表验证该证书。
证书颁发机构(CA)是设备信任的组织。它在服务器证书上的签名让应用确信连接是安全的。
为什么需要自己的CA证书
为了让代理能显示加密的流量,它必须充当应用的服务器。为此,代理会为每个请求的域名即时生成证书,并用它自己的根CA证书签名。
但应用默认不信任这个自制CA。因此我们需要手动将代理的根证书安装到设备的受信任证书存储中。之后,应用会将代理的签名视为可信的,并顺利建立连接。
建议:将代理的根证书视为通行证。在没有发放这个通行证之前,设备不允许代理读取加密流量。
为什么没有信任时只能看到SNI中的主机名
如果代理证书未安装,应用将拒绝通过代理建立加密连接。但依然能看到一些信息:TLS握手开始时,会传输SNI字段,即正在连接的服务器的名称。它让服务器知道客户端请求的是哪个站点。
因此,即使不信任证书,你也能看到应用连接到的域名列表,但无法读取请求和响应的内容。要读取内容,需要安装并信任证书。
什么是SSL pinning
SSL pinning(证书固定)是一项额外的保护措施。应用内部保存了期望的服务器证书或公钥的指纹,并在连接时验证服务器出示的正是该指纹。即使系统中有代理的受信任证书,启用pinning的应用也会拒绝它,因为指纹不匹配。我们将在后面单独讨论如何在调试版本中处理pinning。
✅ 检查:你理解代理通过作为中间人来显示流量,而要读取HTTPS内容,需要在设备上安装并信任代理的根证书。
步骤1:在Android和iOS上配置代理网络
目标:将手机的全部网络流量通过你运行代理工具的电脑转发。
准备电脑并获取其地址
- 确保电脑和手机连接到同一Wi-Fi网络。
- 启动代理工具。对于mitmweb,在终端输入启动Web界面的命令;对于Charles,直接打开应用程序。
- 检查代理监听的端口。mitmproxy默认端口为8080,Charles为8888或8080取决于版本。
- 获取电脑在局域网中的本地IP地址。在Windows上,通过查看网络设置命令获取;macOS和Linux上类似。地址通常类似于192.168.1.15。
建议:将电脑的IP地址和代理端口记在纸上。这两个值稍后将输入到手机设置中。
在Android上配置代理
- 打开手机的设置应用。
- 前往网络和互联网,然后选择Wi-Fi。
- 点击当前网络名称以打开其设置。
- 找到高级选项或编辑网络的图标。
- 在代理字段中选择手动。
- 在代理主机名中填入电脑的IP地址,例如192.168.1.15。
- 在端口字段中输入代理端口,例如8080。
- 点击保存保存设置。
在iOS上配置代理
- 打开设置应用。
- 前往Wi-Fi。
- 点击当前网络旁边的蓝色信息图标。
- 向下滚动到HTTP代理设置部分。
- 选择手动模式。
- 在服务器字段中输入电脑的IP地址。
- 在端口字段中输入代理端口。
- 返回,设置将自动保存。
⚠️ 注意:配置代理后,手机上所有网络流量都将通过电脑。如果代理工具关闭,手机将无法上网。这是正常现象:只需启动代理或移除设置即可。
预期结果
在手机上打开浏览器访问一个简单的HTTP网站。在代理界面中应该能看到请求记录。目前HTTPS只能显示主机名,因为证书尚未安装。
可能的问题。如果没有任何记录,请检查手机和电脑是否在同一网络,IP和端口是否正确,以及电脑的防火墙是否阻止了连接。
✅ 检查:代理窗口中至少能看到来自手机的以域名列表形式呈现的请求。
步骤2:安装并信任根证书
目标:让设备信任代理的根证书,从而能读取HTTPS请求的内容。
下载代理证书
当代理配置好且手机通过它通信时,有一种便捷的方式可以直接在设备上下载证书。
- 在手机上打开浏览器。
- 对于mitmproxy,访问特殊的管理地址mitm.it。这个页面仅在流量经过mitmproxy时出现。
- 你会看到针对不同平台的按钮。根据需要选择Android或Apple。
- 下载证书文件。
- 对于Charles,证书也可以通过程序帮助菜单中显示的地址获得。
在Android 7及更高版本上安装
从Android 7开始,系统区分了两个证书存储:用户和系统。这是非常重要的一点。
- 用户存储。你可以在没有root权限的情况下安装证书。但默认情况下,除非开发者明确允许,应用不信任用户安装的证书。
- 系统存储。所有应用都信任系统存储,但只有root设备或使用无Google服务的模拟器才能向其中添加证书。
要在用户存储中安装证书,请执行以下步骤:
- 打开设置,然后进入安全。
- 找到加密与凭据或高级安全设置。
- 选择安装证书,然后选择CA证书。
- 系统会警告风险,确认安装。
- 选择下载的证书文件。
- 为证书起一个易懂的名称,例如DebugProxy。
重要:正是因为Android 7及以上版本区分了两个存储,你的应用可能即使证书已安装到用户存储,也无法看到流量。解决方案是通过应用配置,我们将在pinning步骤中介绍。
在iOS上安装并信任
在iOS上,过程分为两步:安装配置描述文件和启用完全信任。
- 下载证书后,iOS会提示“已下载描述文件”。
- 打开设置,顶部会出现“已下载的描述文件”。
- 点击它,然后点击右上角的安装。
- 输入设备锁屏密码(如果设置)。
- 确认安装描述文件。
下面是关键步骤,新手常忽略——启用完全信任:
- 打开设置,进入通用。
- 选择关于本机。
- 向下滚动到证书信任设置。
- 在列表中找到你的代理证书。
- 打开旁边的开关以启用对根证书的完全信任。
⚠️ 注意:如果不启用“证书信任设置”开关,iOS会认为证书已安装但未受信任。HTTPS流量将无法读取。这是iOS新手最常见的错误。
预期结果
打开浏览器访问任何HTTPS网站。现在代理界面中应该能看到请求和响应的完整内容,而不仅仅是域名。
✅ 检查:代理工具中显示了来自手机浏览器的解密HTTPS请求内容。
步骤3:在Android模拟器和iOS仿真器上完成相同操作
目标:无需实体设备,直接在开发者电脑上完成流量拦截。
Android模拟器
模拟器的优势在于你可以使用不带Google服务的系统镜像,从而获得系统证书存储的访问权限。
- 在Android Studio中打开Device Manager,创建虚拟设备。
- 选择系统镜像时,优先选不带Google Play标记的版本,以便拥有系统分区的写入权限。
- 启动模拟器。
- 可以在模拟器的扩展设置中直接指定代理,或者在模拟器内的Wi-Fi设置中像真实手机一样配置代理。
- 对于系统存储,使用命令行工具以可写模式重启模拟器,并将证书添加到系统分区。
建议:不带Google服务且可访问系统存储的模拟器可以避免许多证书信任问题。这是定期调试的最佳选择。
iOS仿真器
macOS上的iOS仿真器使用macOS系统的受信任证书,从而简化配置。
- 将代理根证书安装到Mac的系统钥匙串中。
- 打开钥匙串访问应用,找到代理证书。
- 双击打开,在信任部分设置为始终信任。
- 通过Xcode启动仿真器。它将继承来自macOS的证书信任。
- 仿真器的流量将通过Mac的系统代理(如果已配置)或通过网络设置中指定的代理。
预期结果。两种情况下,你都能看到在模拟器/仿真器中运行的测试应用或浏览器的解密流量。
可能的问题。如果Android模拟器未使用代理,请检查其内部Wi-Fi设置和启动参数。对于iOS仿真器,请确认钥匙串中的证书标记为受信任。
✅ 检查:来自模拟器或仿真器的流量在代理工具中以解密形式显示。
步骤4:在调试版本中处理SSL pinning
目标:了解应用是否存在证书固定(pinning),并通过平台的标准方法仅在调试版本中正确削弱它。
这是最关键的部分,请仔细阅读。
如何判断pinning已启用
如果代理证书已安装并受信任,浏览器可以显示流量,但你的应用仍然无法工作或报网络错误,那么很可能应用中启用了pinning。
- 在代理界面中,你会看到应用域名的TLS握手阶段连接中断。
- 应用日志中可能出现证书验证错误或不可信链的消息。
- 通常开发者自己也清楚,为了保护发布版本,他们有意添加了pinning。
在Android上通过network_security_config削弱pinning
Android提供了标准的网络安全配置机制。你可以用它来仅允许调试版本信任用户证书。
- 在项目中创建网络安全配置文件,放在资源目录下。
- 在该文件中,使用专门的调试覆盖块描述仅针对调试配置的证书信任规则。
- 指示应用在调试模式下信任用户证书存储。
- 在manifest中通过相应属性引用此文件。
- 确保调试覆盖仅在应用以调试模式构建时生效,发布时完全不使用。
重要:专门的调试覆盖块仅当应用标记为可调试时才生效。在发布构建中,这些规则完全被系统忽略,从而保证安全。
在iOS上通过Info.plist设置削弱检查
在iOS上,应用传输安全(ATS)控制传输安全性。在调试版本中,你可以针对测试环境的特定域名放宽严格检查。
- 打开调试配置的Info.plist文件。
- 为需要的测试服务器域名添加应用传输安全设置。
- 请记住,ATS控制连接策略,而应用代码中自实现的pinning需要单独关闭。
- 如果pinning在代码中实现,添加条件仅当发布配置时才执行指纹验证。
⚠️ 注意:切勿将放宽的检查留在发布版本中。这会为用户应用带来实际漏洞。所有更改应严格限定在调试配置中,并在发布时自动消失。
为什么只限调试版本,永不进入发布
SSL pinning保护应用用户免受流量拦截。在调试中关闭它,是因为你在自己控制的设备上,有意识地、临时地进行诊断。而在发布版本中,这种保护至关重要,必须保持严格。
建议:根据构建标志分离证书验证逻辑。配置得即使意外也无法构建出带有放宽检查的发布版本。这将保护你免受人为错误。
预期结果
正确配置调试版本后,你的应用将通过代理建立连接,并且你能看到它解密的请求和响应。
✅ 检查:你的应用对其API的请求在代理中以可读形式显示,并且这些更改仅影响调试构建。
步骤5:读取和分析流量
目标:学会找到所需请求、过滤杂音、导出数据、重放请求以及篡改响应。
过滤和搜索
即使是一个小型应用也会产生数十个请求。过滤器帮助找到需要的内容。
- 使用按域名过滤,只保留对你的API的请求。
- 根据内容类型过滤,例如仅JSON响应。
- 在请求或响应的正文中搜索字符串,以快速定位特定调用。
- 在Charles中有按主机组织的树形视图,在mitmweb中有灵活的过滤字符串。
建议:设置过滤器仅显示你应用的域名。这会立即去除系统和第三方服务的后台流量。
导出为HAR格式
HAR格式是保存一次会话流量的标准方式,适合发给后端团队或附加到bug报告中。
- 选中所需的请求或整个会话。
- 在工具菜单中选择导出为HAR格式。
- 保存文件并附加到项目管理工具的任务中。
重放请求
有时需要多次重放同一请求,例如验证幂等性或复现bug。
- 在列表中选择请求。
- 使用重放功能,在Charles中是Repeat,在mitmproxy中是重放流的命令。
- 如果需要,在重放前编辑请求,修改头部或正文。
篡改响应以测试错误场景
这是一个强大的功能。你可以让应用收到你想要的响应,而非真实响应。
- 配置篡改规则,在Charles中可以使用Map Local或Breakpoints,在mitmproxy中使用Python脚本。
- 指定当请求特定地址时,返回预准备的响应,例如500错误或空列表。
- 在应用中运行场景,观察它如何处理错误。
建议:利用响应篡改功能,方便地测试应用在糟糕网络、服务器错误和意外数据下的行为,而无需改动真正的后端。
✅ 检查:你能够过滤流量、导出HAR、重放请求以及针对自己的应用篡改响应。
移动代理如何帮助从不同网络和地区测试应用
单独说明一下移动代理。这些代理通过真实的移动运营商网络运行。它们有助于测试当用户从不同地区的移动网络访问时,你的应用表现如何。
QA为什么需要这个
- 验证地区内容。许多应用根据用户所在地区显示不同数据。移动代理可以让你以所需地区用户的视角查看应用。
- 在移动网络上测试。应用在移动网络上的行为与Wi-Fi不同:延迟不同、IP变化、运营商网络特性。移动代理有助于重现这些条件。
- 测试基于地域的逻辑。如果你的后端通过IP确定区域,你可以验证不同地区的逻辑是否正常工作。
重要:仅应将移动代理用于测试自己的应用,且遵守法律。这是QA用于验证地区逻辑正确性的工具,而非规避任何东西的手段。诸如MobileProxy.space之类的移动代理服务提供合法的移动IP用于此类任务。
建议:将用于更改出口点的移动代理与用于读取流量的本地MITM代理结合使用。这样你既能查看请求内容,也能验证地区行为。
结果验证:成功配置的检查清单
按此列表确认一切工作正常。
- 代理工具已启动并监听指定端口。
- 手机、模拟器或仿真器的流量通过代理转发。
- 设备的根证书已安装并受信任。
- 浏览器的HTTPS流量以解密形式可读。
- 应用调试版本中的pinning已通过标准手段削弱。
- 你的应用对API的请求在代理中完整显示。
- 你能够过滤、导出、重放和篡改请求。
如何测试
- 启动应用的调试版本。
- 执行典型场景,例如登录并加载主屏幕。
- 确认在代理中看到了对你的API的请求,且正文可读。
- 重放一个请求,并篡改一个响应,以检验应用的响应。
成功指标。你能够看到自己应用网络交互的完整生命周期,并能影响它以进行测试。
常见错误及解决方案
按问题、原因、解决方案的结构列出常见问题。
应用忽略系统代理
问题:代理中没有流量,但浏览器工作正常。原因:应用使用自己的网络栈,不读取系统代理设置。解决方案:在调试版本中配置网络客户端使其尊重系统代理,或使用网络级别的透明代理模式。
QUIC流量不可见
问题:部分请求缺失。原因:应用使用基于UDP的QUIC协议,普通HTTP代理无法拦截。解决方案:在调试版本中暂时禁用网络客户端的QUIC支持,使流量回退到普通HTTPS,从而在代理中可见。
Android 14的细节
问题:证书已安装但应用不识别。原因:在新版Android中,用户证书的管理规则更严格,应用默认不信任它们。解决方案:使用带有调试覆盖的网络安全配置,或在模拟器上使用系统存储。
iOS不解密流量
问题:应用在iOS上的请求不可读。原因:证书已安装但未在“证书信任设置”中启用完全信任。解决方案:进入设置、通用、关于本机、证书信任设置,打开开关。
gRPC和HTTP/2
问题:数据可见但为二进制不可读格式。原因:应用使用基于HTTP/2的gRPC,采用二进制序列化。解决方案:使用支持HTTP/2的工具,并视情况安装解码消息格式的插件以读取内容。
配置代理后无法上网
问题:手机无法连接网络。原因:代理工具已关闭,但代理设置仍在。解决方案:启动电脑上的代理,或移除手机Wi-Fi设置中的代理配置。
防火墙阻止连接
问题:手机无法连接到代理。原因:电脑防火墙阻止了代理端口的入站连接。解决方案:在系统防火墙中添加放行规则,允许代理端口。
附加功能和高级设置
掌握基本配置后,可以扩展工具集。
脚本和自动化
mitmproxy允许编写Python脚本自动修改请求和响应。这对于回归测试和复杂篡改场景非常有用。
保存会话
将记录的流量会话保存到文件,以便后续查看或与团队共享。加快bug分析速度。
映射到本地文件
将响应映射到本地文件的功能允许你独立于后端开发应用界面。只需为应用提供预先准备好的JSON响应。
限速
许多代理可以人为减慢连接速度。这有助于检查应用在慢速网络下的行为并发现超时问题。
建议:收集一组典型的篡改和减速场景,在每次发布时复用。这会将手动调试转变为可重复的测试过程。
FAQ:常见问题
Android需要root才能读取流量吗?
对于用户存储和自己应用(带debug配置)来说,root不是必须的。要访问真实设备上的系统存储需要root,但更简单的方法是使用不带Google服务的模拟器。
是否可以不安装证书?
没有受信任的证书,你只能看到SNI中的域名,无法看到HTTPS内容。要读取请求,证书是必须的。
为什么浏览器能看到流量而应用不能?
很可能应用中启用了SSL pinning或自定义网络栈。请按照pinning步骤配置调试构建。
安装代理根证书安全吗?
在测试设备上且仅在调试期间是可接受的。调试结束后请删除证书,以免在设备上留下不必要的信任。
如果流量走QUIC怎么办?
在调试构建的网络客户端中禁用QUIC,使连接回退到普通HTTPS,以便代理可见。
可以分析他人应用的流量吗?
不可以。只能分析你自己的应用或获得所有者明确授权的应用。这是基本原则。
Charles和mitmproxy,新手该选哪个?
Charles凭借其图形界面更容易上手。mitmproxy在自动化方面更强大。从你觉得顺手的开始。
调试后如何撤销所有更改?
移除Wi-Fi代理设置,在安全设置中删除已安装的证书,并以发布配置重新构建应用,启用完整检查。
为什么iOS上的证书信任不生效?
你安装了描述文件,但未在“证书信任设置”中启用完全信任。这是必须单独执行的步骤。
能否在慢速网络上查看流量?
可以,许多代理可以人为减慢连接速度,以测试应用在不良网络下的行为。
结论
恭喜,你现在拥有了分析自己移动应用网络流量的完整技能。你学会了如何选择mitmproxy、Charles、Proxyman和Burp,搭建本地代理,并通过它转发手机、模拟器和仿真器的流量。
你理解了MITM代理的工作原理以及为什么需要受信任的根证书,掌握了Android 7及以上证书存储的细微差别以及iOS上必须启用的信任步骤。你明白了如何仅在调试构建中通过平台标准手段安全地削弱SSL pinning,绝不触及发布版本。
最后,你能够读取、过滤、导出、重放和篡改请求,还能使用移动代理在法律范围内检查应用的地区行为。
下一步做什么
在实际项目中巩固技能:配置截取自己应用的流量,并将典型的响应篡改场景纳入测试流程。逐步熟悉自动化脚本,并与团队分享流量会话。
进一步发展方向:深入分析HTTP/2和gRPC,学习为mitmproxy编写脚本,掌握将流量拦截集成到自动化测试中。始终记住基本原则:只操作自己的应用或获得所有者明确授权,遵守法律,尊重用户隐私。