iOS 抓包实战:Fiddler 配置、HTTPS 解密与证书信任指南
做 iOS 端开发或者测试早晚会撞上那种“日志里什么都没报但接口就是不对”的时刻。这时候光盯着代码没用最直接的办法就是抓包把手机发出去的每一条请求原封不动地摆在你面前看它到底请求了哪个地址、带了什么参数、服务端又回了什么。我自己这几年在 iOS 上抓包用得最多的还是 fiddler准确说是 Fiddler Classic 这个 Windows 桌面版。它免费、装完就能跑、对 HTTPS 的解密也够日常开发折腾。这篇就把我用 fiddler 给 iOS 手机抓包的整套流程拆开讲一遍电脑端要改哪几个开关、手机端怎么把流量引过来、证书怎么装、那个很多人都会漏掉的“证书信任”开关在哪以及抓不到包的时候该怎么一步步排查。新手照着走能跑通用过一阵子但总卡在某一环的人大概率也能在这里找到答案。1. 先想清楚iOS 抓包到底在解决什么问题1.1 我在哪些场景下必须抓包抓包这件事听起来很“底层”但落到日常工作里它解决的都是很具体的问题。最常见的是接口联调前端说参数传了后端说没收到谁也说服不了谁抓一条包出来请求体里到底有没有那个字段一目了然。第二类是排查线上问题比如某个页面在特定机型上白屏本地怎么都复现不了抓包一看发现请求被重定向到了另一个域名或者返回了一个 401问题瞬间定位。第三类是做竞品或者协议分析这个我得说清楚边界分析的前提是你要看的接口本身是公开的、或者你有权限去调试的目标不要拿它去干违反规则的事。第四类是测试场景构造比如你想验证 App 在服务端返回异常数据时的表现总不能真让后端给你改代码这时候用工具把响应拦下来替换成你想要的 JSON效率高得多。第五类就是弱网测试模拟地铁、电梯里那种网络环境看 App 的加载态、重试逻辑写得对不对。这几类场景有一个共同点它们都需要你“站在手机和服务器中间”看到真实的、未经 App 代码粉饰的网络行为。日志会骗你因为日志是代码写的抓包不会因为它是链路上真实流动的字节。1.2 Fiddler、Charles、Wireshark 该怎么选工具没有绝对的好坏只有合不合适。我平时三个都在用分工大概是这样的工具擅长的事不适合的事我的使用频率Fiddler ClassicHTTP/HTTPS 调试、改包、Mock、脚本自动化非 HTTP 流量、UDP/QUIC日常主力Charles界面更友好、Mac 上体验好、移动端查看方便脚本能力弱一些换 Mac 时用Wireshark抓所有协议、看 TCP/UDP 层细节、分析握手HTTP 层可读性差配置门槛高排查底层问题时用选 Fiddler 的理由很实在Windows 环境零成本解 HTTPS 只要勾一个选项而且它自带 FiddlerScript能用几行脚本批量改请求这是很多图形化工具做不到的。缺点也有它只能处理 HTTP 和 HTTPS遇到走 UDP 的 QUIC、或者走自定义 TCP 协议的 App它就无能为力了那种情况必须换 Wireshark。顺便提一句如果你的目标协议不是 HTTP比如蓝牙通信、私有 TCP 长连接那 Fiddler 从一开始就不是正确工具别在它身上浪费时间。1.3 整条链路是怎么跑起来的很多人配不成功根本原因是不理解数据是怎么流的。用一句话概括Fiddler 在你的电脑上开了一个监听服务手机把网络请求先发给电脑电脑再转给真正的服务器回来的时候原路返回。电脑在这里扮演的是一个“中转站”的角色。所以你会看到三个地址手机、电脑Fiddler 所在机器、真实服务器。手机并不知道服务器的真实地址它只知道电脑的地址。这就要求两件事第一手机和电脑要在同一个网络里能互相访问第二Fiddler 必须允许“远程连接”默认它只接受本机请求手机过来的连接会被直接拒掉。理解了这条链路后面所有的排查都有了方向。手机没网说明中间这一跳断了HTTPS 显示成一串看不懂的隧道信息说明解密没开只有部分 App 抓不到说明是那个 App 自己有额外的校验。所有的“为什么”都能顺着链路往回找。2. 电脑端准备装好 Fiddler 之后必须先改的几个开关2.1 下载哪个版本别下错打开官网会看到两个东西Fiddler Classic 和 Fiddler Everywhere。名字很像但完全是两个产品。我们这篇文章讲的是 Fiddler Classic它是免费的、老牌的、功能完整的 Windows 桌面版。Everywhere 是后来推出的跨平台订阅制产品界面漂亮但部分功能要付费脚本能力也不一样。所以下载的时候认准 Classic。安装过程没什么好说的一路下一步就行安装完第一次启动它会问你要不要配置系统环境一般默认就好。启动之后界面是那种很传统的 Windows 三栏布局左边是会话列表右边上半部分是请求下半部分是响应。这里有个小坑别装在中文路径下面也别把抓包文件存到带空格的路径里。我遇到过证书生成失败折腾半天发现是安装目录里有中文字符。虽然新版已经改善很多但避开这个坑没坏处。2.2 HTTPS 解密相关的三个开关Fiddler 装完默认只能看到 HTTP 请求HTTPS 在它眼里就是一串加密数据。现在哪个 App 还在用纯 HTTP所以这一步是必做的。打开Tools → Options → HTTPS你会看到几个复选框这里逐个解释为什么要勾Capture HTTPS CONNECTs捕获 HTTPS 连接不勾这个Fiddler 连 HTTPS 请求发生了都不知道会话列表里会一片空白。这个必须勾。Decrypt HTTPS traffic解密 HTTPS 流量这是核心开关。勾上之后Fiddler 会动态生成一张证书冒充服务器和你的手机完成握手这样它才能看到明文。Ignore server certificate errors忽略服务端证书错误开发环境里服务端证书经常是自签的不勾这个会一直报错。勾完 Decrypt 之后Fiddler 会弹窗问你要不要现在就把根证书装到 Windows 的证书库里选“是”。如果当时点了“否”后面可以用旁边的Actions → Trust Root Certificate补上。注意这三个开关里最容易漏的是第一个。很多人只勾了解密结果发现根本没有 HTTPS 会话出现原因就是 CONNECT 都没被捕获到。2.3 允许手机接入端口和远程连接这是整个配置里最关键、也最容易被跳过的一步。切到Tools → Options → ConnectionsFiddler listens on port默认是 8888。记住这个数字手机端要填一样的。如果 8888 被别的程序占用了比如某些开发工具改成 8889 之类也行但要记得两边同步改。Allow remote computers to connect允许远程计算机连接这个务必勾上。不勾手机发过来的请求会被直接拒绝现象就是手机连上之后完全没网。勾完之后必须重启 Fiddler这个设置不是即时生效的。我见过有人勾了没重启然后花半小时找问题最后重启一下就好了。这个坑值得单独拎出来说。2.4 防火墙放行和找到电脑的 IP设置改完了还得让手机的请求能真的走到这台电脑上。Windows 防火墙默认会拦掉外部进来的连接所以第一次启动 Fiddler 时如果弹出防火墙提示一定要选“允许访问”而且专用网络和公用网络两个都要勾。然后是找 IP。打开命令行执行ipconfig在一堆输出里找当前正在使用的那个网络适配器看IPv4 地址一般是192.168.x.x或者10.x.x.x这种。这个地址就是手机端要填的服务器地址。这里有个特别常见的坑电脑上如果装了虚拟机或者开了多个网卡会出现好几个 IP你得选对那个和手机在同一网段的。判断方法很简单看手机的 IP 是不是同一个前缀比如手机是 192.168.1.7那你要找的就是 192.168.1.x 那个。选错了手机就会一直卡在“正在连接”。如果嫌每次找 IP 麻烦可以在Connections页面下方勾选 “Enable IPv6”或者干脆在电脑上固定一个静态 IP省得路由器重新分配之后又要重配一次。3. iOS 手机端从连网络到信任证书3.1 先确保两者在同一张网里配置之前先确认手机和电脑连的是同一个无线网络。听起来是废话但真的有人手机连着 5G 流量、电脑连着办公室 Wi-Fi然后问我为什么抓不到。如果公司网络做了终端隔离很多企业无线网就是这种设计同一张网下面设备之间互相不通那就换个思路用手机开热点给电脑连反过来也行这是最省事的办法。另外提一句如果公司内网的无线网络是需要账号认证的那种企业级网络手机改完网络设置之后可能会连不上这种环境下我一般直接切到手机热点来做避免和认证机制纠缠。3.2 把手机的网络指向电脑打开 iOS 的设置 → 无线局域网点当前连接网络右边的那个蓝色圆形信息按钮滑到最底部会看到 HTTP 相关的设置区域默认是关闭状态把它切换成“手动”。然后填两个东西服务器填刚才ipconfig查到的电脑 IPv4 地址端口填 Fiddler 里设的那个默认 8888填完点右上角“存储”这一步就完成了。这时候你可以先别管证书随便用浏览器打开一个网站试试。如果能打开说明链路通了如果转圈打不开先跳到第 5 章去排查别急着往下走。提示填完设置后 iOS 有时会弹一个“存储”确认框如果没点存储直接返回设置是不生效的这个细节很容易漏。3.3 下载并安装根证书链路通了之后用 iOS 自带的浏览器打开这个地址http://电脑的IP:8888比如http://192.168.1.100:8888。注意是http 不是 https因为这时候证书还没装https 会直接报错。页面打开后找到下载证书的入口Fiddler 会给你一个.cer文件。点击之后系统会提示“此网站正尝试下载一个配置描述文件”选“允许”。下载完不会自动安装需要手动去装设置 → 通用 → 设备管理部分系统版本这个位置显示为“描述文件与设备管理”在“已下载的描述文件”里找到那个 Fiddler 相关的条目点击“安装”会要求你输入锁屏密码一路确认下去。安装完成后这个条目会从“已下载的描述文件”移到上面说明装好了。很多人走到这一步就以为大功告成了其实还差最后、也是最关键的一步。3.4 iOS 10.3 之后必须做的那一步证书信任从 iOS 10.3 开始光是安装描述文件是不够的系统默认不信任用户自己装的根证书必须手动把它标为信任。路径是设置 → 通用 → 关于本机 → 证书信任设置进去之后会看到一个列表找到刚才装的 Fiddler 证书把右边的开关打开。系统会弹窗警告确认即可。这一步为什么这么重要因为如果你只装了证书没开信任现象非常迷惑链路是通的HTTP 请求能抓到但所有 HTTPS 请求要么直接失败要么在 Fiddler 里显示成一堆看不懂的隧道信息。新手在这里卡住的概率极高所以我建议你把它当成一个固定动作装完证书就顺手去打开。3.5 抓完之后记得收回的两件事调试结束别忘了做两件收尾工作。第一把手机的 HTTP 设置改回“关闭”否则一旦电脑上的 Fiddler 关了手机就会完全上不了网这个现象很多人会误以为是 Wi-Fi 坏了。第二把那张根证书从信任列表里关掉、并把描述文件删除。毕竟开着信任意味着所有流量都要经过这个过程日常使用没必要。这个好习惯我强烈建议养成我自己就吃过亏有一次调试完忘了改回来第二天在客户现场演示手机死活连不上网排查了十几分钟才想起来是自己挖的坑。4. 跑通第一条请求并把会话读明白4.1 怎么判断链路是不是真的通了配置全部做完现在用手机随便打开一个 App 或者浏览器访问一个网站回到 Fiddler 看左边的会话列表。如果开始刷刷刷地出现记录恭喜成了。每条记录左边有个图标代表协议类型中间是主机名右边是返回的状态码。如果列表还是空的先别急着改配置检查三件事手机的网络设置有没有真的保存成功、Fiddler 有没有重启过、Windows 防火墙有没有放行。这三条覆盖了八成以上的“抓不到”。Fiddler 左下角有一个状态区会显示当前捕获了多少条会话。你也可以用Ctrl X清空列表重新操作一次这样看着更清楚不会被无关请求干扰。4.2 请求面板里真正值得看的东西点一条会话右上区域是请求信息分成三个标签页Headers、WebForms、Raw。Headers 是我看得最多的里面有请求方法、完整的 URL、Host、Cookie、User-Agent、Authorization 这些。尤其是自定义的请求头很多业务逻辑藏在里面比如设备 ID、版本号、签名串。WebForms 标签页会把表单参数和 JSON 自动解析成键值对比看原文舒服很多。Raw 就是最原始的字节内容当解析出现乱码或者结构不标准时看 Raw 才能看清真相。这里分享一个判断技巧如果一条请求的 URL 里带着一堆你看不懂的签名参数说明这个接口做了防篡改设计你想通过改包来测试它改完之后服务端大概率会返回签名校验失败。这不是你配置错了是接口本身设计如此遇到这种情况别硬刚换个思路去测。4.3 响应面板与状态码怎么快速定位问题右下区域是响应同样有 Headers、Transformer 等标签。我一般先看状态码它能直接告诉你问题的大方向状态码常见含义排查方向200正常返回看业务字段里的 code 是不是 0301 / 302重定向看 Location 头指向哪域名换了没304用了缓存本地缓存策略是否导致数据不更新401未授权Token 过期或没带上403被拒绝权限不足或触发了风控404路径不对拼接的 URL 有没有写错500服务端异常看响应体里的错误堆栈502 / 504网关问题服务端部署或超时有个坑要提醒很多 App 无论业务成功失败HTTP 状态码都返回 200真正的结果藏在响应体的 JSON 里比如{code: 1001, msg: 登录失效}。所以光看状态码不够还要展开响应体看内容。这一点在排查“为什么页面是空的但请求没报错”时特别关键。另外响应体如果是乱码通常是压缩导致的Fiddler 默认会自动解压如果还乱检查 Headers 里的Content-Encoding或者点一下响应区的“解压缩”按钮。4.4 用断点和 AutoResponder 做改包与 Mock抓包只是第一步能改包才算真的把工具用起来了。最常用的两个功能断点Breakpoint在会话上点右键选Break on Request或者Break on Response下次这条请求会被拦下来你可以直接编辑请求参数再放行。这个功能在验证服务端参数校验逻辑时特别好用比如你想知道服务端有没有对某个字段做非空校验手动删掉它试试就知道了。AutoResponder切到右侧的 AutoResponder 标签页勾选Enable rules然后把某条已经抓到的会话拖进去就能创建一条规则。之后所有匹配这个 URL 的请求都会直接返回你指定的本地文件内容根本不会发到真实服务器。这个功能用来 Mock 接口简直是神器前端可以不依赖后端就开发测试也可以模拟各种异常返回。规则匹配支持通配符和正则比如regex:.*/api/user/\d能匹配一批接口。匹配之后返回内容可以选择本地文件、也可以直接在下方的编辑框里写响应体。我一般会准备几个 JSON 文件放在固定目录切换返回内容只要换一下文件路径就行。注意AutoResponder 的规则是全局生效的调试完记得把Enable rules取消勾选否则下次抓包你会疑惑为什么请求根本没发出去。5. 常见问题与排查实录5.1 手机改完设置后彻底没网这是最高频的问题按顺序往下查第一步看 Fiddler 是不是在运行。如果 Fiddler 关了手机的网络设置还指向它那就是彻底断网。第二步检查Connections里的“允许远程计算机连接”有没有勾上、勾完之后有没有重启过 Fiddler。第三步看 Windows 防火墙。有个简单粗暴的验证办法在电脑上用浏览器访问http://127.0.0.1:8888能打开说明 Fiddler 服务本身正常如果手机还是连不上那问题一定出在防火墙或者网段上。还有一种情况是电脑和手机虽然显示连的是同一个 Wi-Fi 名字但一个走 2.4G 一个走 5G有些老路由器会做隔离导致互相不通。这时候换成手机热点最省事。5.2 HTTPS 全是隧道信息看不到明文会话列表里如果出现大量显示成隧道形式、而不是正常请求的记录说明 HTTPS 解密没生效。排查顺序先确认Decrypt HTTPS traffic勾了再确认手机上的证书信任开关打开了。这两个都确认了还不行就去Tools → Options → HTTPS → Actions里点Reset All Certificates把 Fiddler 已有的证书全部重置然后重新生成、重新给手机装一遍。证书重置这个操作很多人不知道但它能解决大部分“证书明明装了就是不行”的诡异情况。特别是多台电脑共用一套配置的时候旧的证书残留会导致混乱。5.3 部分 App 抓不到包如果浏览器能抓、某些 App 就是抓不到八成是下面三种原因之一。证书固定SSL PinningApp 内部内置了服务端证书的指纹只认那一个Fiddler 的动态证书直接被拒绝。现象是这些接口在 Fiddler 里显示连接失败或者一片空白。这种属于 App 的主动安全设计是正常的说明你要调试的 App 在安全上做得比较到位。遇到它只能从其他角度想办法比如找开发要一份开发环境的包或者接受“这个 App 抓不了”的事实。走了非 HTTP 协议比如用 UDP 传输数据、或者用 gRPC、自定义 TCP 协议。Fiddler 只能看 HTTP 和 HTTPS这些它完全无能为力得换 Wireshark 这类工具。还有 App 用了基于 UDP 的新版 HTTP 协议同样抓不到因为 Fiddler 不处理这类连接。App 检测了调试环境有些应用会检测当前网络是不是处于被监听的状态一旦识别到就直接走另一条链路或者干脆不请求。这种情况需要更深入的方案普通开发者日常调试遇不到遇到了基本也只能绕。5.4 证书信任开关是灰的或者找不到路径找对了但开关点不动通常是两个原因一是证书没装成功回到设置 → 通用 → 设备管理确认那个描述文件确实存在二是系统版本差异不同 iOS 版本这个菜单的位置会有细微变化老版本可能在“通用”下面直接有“描述文件”这一项。还有一种情况是描述文件装完之后在“设备管理”里找不到多半是下载环节没成功。重新用浏览器访问一次下载地址注意一定要用系统自带浏览器第三方浏览器有时候不会正确触发描述文件的下载流程。5.5 几个零碎但很烦人的坑时间不同步手机和电脑的系统时间差太多证书校验会直接失败。这种情况少见但确实存在尤其是长时间没联网的设备看一下时间是不是对的。端口被占用如果 Fiddler 启动时报端口占用的错误去Connections里换一个端口比如 8899然后手机端同步改。多网卡混乱电脑同时连着有线和无线手机连的是无线的那个但ipconfig里第一个列出来的是有线网卡的 IP填错了就连不上。养成习惯填之前 ping 一下确认。会话太多看不过来Fiddler 支持在左侧的过滤栏里加条件比如只显示某个域名的请求。也可以点会话右键选Filter Now快速过滤省得在一堆无关请求里翻找。现象最可能的原因快速验证方法手机完全没网电脑端未允许远程连接 / 防火墙拦截检查设置并重启 Fiddler有会话但 HTTPS 无明文证书信任开关没开去证书信任设置里确认只有浏览器能抓App 做了证书固定换一个普通 App 对比测试电脑自己抓不到正在访问的地址被排除了检查过滤规则和连接设置下载证书页面打不开地址写成了 https改成 http 重试证书安装后不生效需要重置并重新生成用 Actions 里的重置功能6. 进阶玩法脚本、弱网和批量处理6.1 用 FiddlerScript 批量改请求Fiddler 内置了一套脚本引擎入口在右侧的 FiddlerScript 标签页。它的价值在于AutoResponder 只能按 URL 匹配做整条替换而脚本可以按条件改任意一个字段灵活度高一个量级。举个我常用的例子给某个域名的所有请求统一加一个调试头同时给接口加一点延迟static function OnBeforeRequest(oSession: Session) { // 只处理目标域名 if (oSession.HostnameIs(api.example.com)) { oSession.oRequest[X-Debug-Client] local-dev; // 给请求加 500 毫秒延迟方便观察加载态 oSession[request-trickle-delay] 500; } }保存后立即生效不用重启。想恢复到默认状态把新增的代码删掉就行。我的建议是改脚本之前先把原始内容整个复制一份备份到记事本里因为这个脚本页面一旦改乱有时候会报错导致抓包功能异常有备份能马上还原。6.2 弱网测试怎么配才像真的做弱网测试Fiddler 提供了一个现成的开关Rules → Performance → Simulate Modem Speeds。勾上之后请求和响应都会被加上延迟体验一下子回到拨号时代。但这个默认值是有讲究的它模拟的是很早期的网络环境延迟设得比较夸张。如果你要模拟真实的移动网络建议去脚本里改这两个值// 在 OnBeforeRequest 里 if (m_SimulateModem) { oSession[request-trickle-delay] 300; // 上行每 KB 延迟 oSession[response-trickle-delay] 150; // 下行每 KB 延迟 }单位是毫秒数值越大越慢。我一般的做法是分档测试300 毫秒模拟普通 4G800 毫秒模拟信号差的电梯2000 毫秒模拟几乎断网的极端场景。重点看 App 在这三种情况下的表现是不是有区别比如超时时间设得合不合理、有没有给用户一个可用的加载提示、重试逻辑会不会引发请求风暴。有个经验点很实用弱网测试真正要验证的往往不是“能不能加载出来”而是“加载不出来的时候用户看到了什么”。空白页、转圈转十分钟、还是明确的错误提示加一个重试按钮这三者的体验差距是天壤之别。6.3 会话导出与用脚本批量处理抓完一堆会话如果想要留存或者做批量分析Fiddler 支持导出成多种格式在File → Save里选。最通用的是 HAR 格式各大抓包工具都认.saz是 Fiddler 自己的格式本质上是个压缩包可以把里面的原始数据解出来。导出 HAR 之后用 Python 处理起来很方便import json with open(capture.har, r, encodingutf-8) as f: har json.load(f) for entry in har[log][entries]: req entry[request] resp entry[response] url req[url] status resp[status] mime resp.get(content, {}).get(mimeType, ) # 只关心接口请求过滤掉图片等静态资源 if application/json in mime: print(req[method], status, url)这样几行就能把一次抓包里所有返回 JSON 的接口列出来比在界面里一条条点快得多。如果你更习惯用现成的分析工具也可以直接把 HAR 导入到其他支持该格式的软件里看。这里要纠正一个常见误解有人以为可以用 Python 的 pyshark 库直接读取 Fiddler 抓到的东西这是行不通的。pyshark 本质上是调用底层抓包程序去读网卡数据或者解析 pcap 文件它和 Fiddler 是两套完全独立的体系Fiddler 的会话数据它读不了。想用 pyshark就得从网卡层面重新抓一份 pcap那是另一条技术路线了和本文讲的这套流程不通用。7. 我个人踩坑之后沉淀下来的几条经验先说最容易反复踩的一个改配置之后一定要重启 Fiddler。远程连接开关、端口号这类设置不是热生效的我至少有三次是在这上面浪费了时间后面养成习惯改完就重启省心很多。第二建立一个固定的调试检查清单。我现在每次开始抓包会按顺序过一遍Fiddler 在跑吗、远程连接开了吗、手机网络设置没关吗、证书信任开关是开着的吗。就这四条能覆盖我遇到过的九成问题。形成肌肉记忆之后配置一次大概两分钟比出了问题再回头找快得多。第三善用过滤。刚开始抓包的时候什么都想抓结果一个页面几百条请求真正关注的接口埋在里面找不到。后来我养成习惯抓之前先在过滤栏里填上目标域名或者在脚本里写条件视野一下子干净了。这一步看起来是小事但它直接决定了你排查问题的速度。第四关于证书这件事我的建议是调试完就清理。描述文件和信任开关都收回去手机设置改回关闭。这不只是习惯问题也是安全习惯始终开着意味着你的所有网络请求都会经过一台电脑这在陌生网络环境下是有风险的。最后分享一个我自己觉得很有用的思路不要把抓包当成“抓不到就想办法抓”的技术活而是把它当成“先想清楚我到底要确认什么再去抓”的分析活。我见过太多人抓了一大堆包结果根本不知道自己要找什么。坐下来先问自己一句我怀疑哪一步出了问题是请求没发出去还是参数错了还是服务端返回不对带着这个假设去抓往往几条包就能定位效率天差地别。这套流程我在 Windows 上跑了几年从早期的版本一直用到最近的新版核心步骤基本没变过。iOS 系统版本换代的时候证书信任的位置偶尔会挪一挪但只要理解那条“手机到电脑再到服务器”的链路任何变化都能自己推出来。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →