ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

手机HTTPS抓包实战:原理、高效方案与SSL Pinning绕过

手机HTTPS抓包实战:原理、高效方案与SSL Pinning绕过 你是不是也遇到过这种场景客户端同学扔过一句话“接口已经联调好了你抓包看一下”你拿起手机开始配 Charles。先确认在同一局域网再手动填代理 IP、端口然后下载证书、去设置里信任证书好不容易能抓了结果请求全红——服务端证书校验直接把连接掐断。半小时过去了你还没看到一条完整请求。这种体验做客户端开发和测试的朋友肯定不陌生。抓个接口而已为什么要被证书和代理折腾这么久这篇文章就奔着一个目标去让你尽量别在手机上折腾那半小时证书和代理。我会先把 HTTPS 接口抓包的原理讲清楚再给几套能真正落地的替代方案包括手机本地抓包工具、电脑开热点无代理抓包、把 Charles 配置压缩到两分钟的实操流程最后补上最让人头疼的证书固定绕过思路和常见问题排查。适合客户端开发者、测试工程师以及所有需要分析 App 接口的人。1. 为什么手机抓 HTTPS 接口这么费劲1.1 HTTPS 抓包的“中间人”原理要理解怎么省事先得明白抓包到底在做什么。正常情况下App 和服务器之间的 HTTPS 通信是加密的你截获到数据包也只能看到密文。抓包工具想做的是一个“中间人”的活让 App 以为自己在和服务器通信又让服务器以为自己在和 App 通信。工具夹在中间把请求解了密、记录下来再原样转发出去。这个过程看起来像是“代理 证书”两件事但很多人误以为它们是一回事。代理解决的是流量往哪走的问题手机把请求发给代理服务器而不是直接发给目标服务器证书解决的是代理能不能解开内容的问题代理拿到请求后想解密就必须让系统信任它伪造的证书。Charles、Fiddler、mitmproxy 这些工具都是这么工作的。打个比方。快递员替你把信送到对方手里正常情况下信是密封的快递员不能拆开。但抓包工具想当快递员的同时还兼职“拆信封检查内容”的工作。为了保证你愿意把信封交给它它得先拿到一个“官方认证”——这就是安装根证书的过程。搞清楚这条链路后面的很多排查思路都能顺下来。1.2 手机端配置的三大坑手机端抓包比电脑端麻烦不是你的操作问题而是整条链路本身就设了关卡。第一个坑是代理配置。手机需要和电脑在同一局域网然后去 Wi-Fi 设置里手动填上电脑的 IP 和抓包工具的端口。办公环境下手机和电脑经常分属不同网段热点隔离也是常态IP 还可能经常变动。填错一位数字所有请求都超时。第二个坑是证书信任。iOS 从 10.3 开始下载证书后还要去“设置 - 通用 - 关于本机 - 证书信任设置”里把“完全信任”打开少一步都不行。Android 7.0 之后更麻烦App 默认不信任用户安装的证书。哪怕你在系统设置里已经装了证书很多 App 依然拒绝连接你必须去处理 networkSecurityConfig或者 root 后把用户证书移到系统证书目录。第三个坑是证书固定也就是 SSL Pinning。有些 App 在代码里写死了只认某一张服务器证书或公钥代理一旦换上自己的证书App 立刻就判定可能存在中间人攻击直接断开请求。这个坑抓自己的 App 也可能踩不少开发者会在生产环境把 Pinning 打开结果调试时自食其果。所以“配半小时”不是因为你笨而是这几道坎一个都绕不过去。下面要讲的方案本质上都是在拆掉其中某一道或某几道坎。2. 方案一手机上装抓包 App彻底告别代理配置2.1 本地虚拟网卡接管流量省掉代理填写如果你只是临时想看某个请求最省事的方式是直接在手机上装一个抓包 App比如 Android 的 HttpCanary、iOS 的 Stream / HTTP Catcher / Replica。这些工具的套路和电脑抓包不一样。它们会在手机本地创建一个虚拟网卡通道主动把系统流量接管过来相当于把抓包器直接塞进手机系统内部。你打开 App、点一下“开始抓包”系统弹一个权限请求同意之后流量就被 App 看到了。不需要设置 Wi-Fi 代理不需要和电脑连同一个局域网也不需要记 IP 端口。以 HttpCanary 为例我实测的流程是这样的下载安装 HttpCanary打开 App点击开始抓包系统弹窗请求建立本地网络的权限点允许切回目标 App 正常操作回到 HttpCanary请求列表里就能看到所有 HTTP/HTTPS 请求。整个过程确实一分钟都用不上。它的证书处理也内置在 App 里你按提示安装、信任即可。但这里有个前提Android 7.0 以上用户证书不被第三方 App 信任的问题依然存在所以抓系统浏览器或没做特殊配置的进程没问题抓特定 App 就得配合第 5 节讲的处理思路。2.2 iOS 端工具的一键引导iOS 上这类 App 的体验通常比 Android 更完整因为它们把“安装证书、信任证书”这两个最容易卡住的步骤做成了引导流程。比如打开某款抓包工具它会提示你先安装 CA 证书点击后自动跳到 Safari 打开描述文件下载页安装完再引导你去系统证书信任设置里打开开关。你跟着提示点前后也就一两分钟比在电脑上开 Charles 再手动配置手机快得多。我一般把这类工具当作“应急抓包”的主力。比如人在外面没有电脑或者只想快速确认某个请求有没有发、参数是不是正确手机本地抓包 App 是效率最高的选择。它的缺点是屏幕小看 JSON 树状结构和请求头比较费眼睛断点修改、流量重放这些高级功能也比不上 Charles但用来应急足够好用。2.3 什么时候选这个方案最合适符合下面任意一条就优先考虑手机本地抓包手边没有电脑或者不想为了抓包专门开电脑只想短期看一两条请求不值得搭一套完整环境手机和电脑不在同一局域网但又不想改现有网络配置。如果你的工作流重度依赖 Charles 的断点修改、Map Local、重放请求这些能力那手机本地抓包只能当补充不能完全替代。我的习惯是应急看包用手机工具正式联调用电脑工具两条路线并行。3. 方案二PC 开热点让手机侧零代理抓包3.1 热点抓包的本质从源头截获流量另一种我很爱用的思路是不用“代理”这个中间角色而是直接从网络层把手机流量截下来。具体做法很朴素电脑开一个 Wi-Fi 热点手机连上这个热点。此时手机的流量必然经过电脑的网卡电脑上随便用什么抓包工具都能看到。这个方案最大的优势是手机端完全不用配代理也不用改任何网络设置。App 做不做代理检测在这个方案里通常影响不大因为流量只是自然经过了电脑并没有人告诉手机“你要走代理”。这跟你手机正常上网没区别App 完全没有感知。但你得知道它的边界HTTPS 是加密的Wireshark 能看到的只是 TLS 握手过程和密文看不到明文 JSON。想解密只有两个前提手机上装了并信任你用来做中间人的 CA 证书那就又把证书环节加回来了你有服务器私钥或者通过 SSLKEYLOG 这类方式拿到了会话密钥。浏览器抓包可以通过环境变量导出密钥手机 App 基本做不到所以这个方案更多是用在“自己的后端服务”上。所以严格说热点抓包解决的是“免代理”不一定是“免证书”。它的真正价值在于排查那些代理模式下会出问题、或者代理工具搞不定的场景。3.2 实操Windows 热点 Wireshark 抓包具体操作我整理过一套Windows 打开系统设置里的“移动热点”手机连接打开 Wireshark选择热点对应的网卡。注意不要选错Windows 上一般是名称里带“Hotspot”或“Local Area Connection”的那个虚拟网卡抓包开始后在过滤栏输入http2 || http || tls能快速定位到相关流量如果只是看 IP、端口、DNS、延迟到这里就够了想解密 HTTPS 明文就提前配置好 SSL 解密或者在测试环境把接口临时改成 HTTP仅限自己可控的后端。这里有一个很实用的经验当你怀疑某个 App 连接的根本不是目标服务器或者想知道它到底做了哪些域名解析时热点抓包比配代理更直接。因为代理模式下很多问题会被工具“浮层化”你看不清底层网络行为而热点抓包看到的是最原始的数据包。3.3 这个方案适合解决哪些“代理抓不到”的问题我踩过这样一个坑某个 App 在代码里做了激进的代理检测只要发现系统代理开启就直接断开网络连接。Charles 在这种场景下完全无解因为手机代理一旦开启App 就开始“自毁”。但热点抓包没有这个限制手机侧零代理App 一切正常流量照样被电脑截获。还有一类情况是抓非 HTTP 协议。App 如果用了 WebSocket、MQTT或者干脆是自研的 TCP 协议Charles 这类应用层代理工具往往支持得不好。而 Wireshark 可以抓到所有经过网卡的数据包只要你知道端口号就能过滤出来。所以我把“热点 Wireshark”这个组合定义成客户端调试的“后备工具箱”平时不一定用但一旦代理方案失灵它能救命。4. 方案三把 Charles/Fiddler 的传统配置压缩到 2 分钟4.1 代理配置可以扫码不用手填如果你还是习惯用 Charles 这类功能完整的工具其实配置过程也没想象中那么痛苦关键是找到快捷方式。Charles 的代理设置页面里有一个二维码按钮。打开 Proxy - Proxy Settings找到“Show QR code”或类似入口屏幕上会出现一个二维码。手机扫码之后系统会自动把 Wi-Fi 代理填好IP 和端口都不用手输。这一步能省掉十分钟手动输入和反复确认 IP 的过程。Fiddler 也有类似能力但体验没有 Charles 顺滑。如果你团队里统一用 Fiddler可以自己写一个简单的代理配置脚本让手机扫码后走预设的配置效果类似。4.2 证书下载别进菜单找直接访问专用地址证书下载也有快捷路径。Charles 运行期间手机浏览器直接访问chls.pro/ssl会弹出下载 Charles 根证书的提示。这比在 Charles 菜单里导出证书、再想办法传回手机要快得多。iOS 安装之后去“设置 - 通用 - 关于本机 - 证书信任设置”把开关打开这一步逃不掉。Android 7.0 的用户证书问题也依然存在但至少下载证书这步省出不少时间。如果你常抓自己的 App建议直接在 AndroidManifest 里的 debug 版本配置 networkSecurityConfig把“信任用户证书”的规则写进去。这样团队里每个人装好自己的证书就能抓包不用每次都 root 手机。这是真正一劳永逸的做法前期配置半小时后面省无数个半小时。4.3 标准流程拆解半小时变两分钟把这些快捷方式串起来我现在的 Charles 标准流程是打开 Charles确认 HTTP Proxy 端口默认 8888确保端口绑定到局域网地址手机 Wi-Fi 代理扫 Charles 生成的二维码一秒完成手机浏览器打开chls.pro/ssl下载并安装证书iOS 去“设置 - 通用 - 关于本机 - 证书信任设置”打开完全信任Android 7.0 确认目标 App 的 networkSecurityConfig或者用模拟器/root 方案回到 Charles在 Proxy - SSL Proxying Settings 里加入抓包目标域名。不确定就先用*:*做测试开始抓包。这套流程我实测过熟手两分钟能走完。你还可以把每一步做成截图文档或者录屏给团队新人直接抄作业避免每个人都在卷证书配置。5. 进阶SSL Pinning 与用户证书信任最后一个大坑5.1 证书固定到底是怎么回事如果说前面的问题还能靠熟练度解决那 SSL Pinning 就是真正拦住很多人的“铁板”。它指的是 App 在代码里写死了对某个服务器证书链或公钥的校验只接受特定证书。抓包工具一旦换上自己的证书App 会立刻识别出这不是它认识的证书随即断开连接。最常见的表现是Charles 里请求发出去了但一直转圈或者直接红屏报错类似SSLHandshake: Received fatal alert: unknown_ca。很多新手看到这个第一反应是证书没装好其实证书早装好了是 App 自己主动拒绝的。5.2 Android 下绕过证书固定的实操思路在 Android 上绕过证书固定的常见路子有几种先判断 App 到底有没有做 Pinning。很多时候只是 Android 7.0 的用户证书信任问题把用户证书复制到系统证书目录就能解决。有 root 的情况下用 Magisk 模块MagiskTrustUserCerts或同类模块重启后证书会被当作系统证书。如果确认是 Pinning可以用 Xposed 模块JustTrustMe这类工具Hook 掉相关证书校验逻辑。这个操作对 App 执行环境入侵性很强只建议在你自己开发或明确授权的测试 App 上使用。没有 root 也不想折腾最实用的方式是用 Android 模拟器带 root 做抓包。模拟器里装模块、改系统证书都比物理机方便而且镜像可以复制给团队其他人新同事拿到就能用。这里必须提醒一句绕过证书固定属于偏黑盒的手段拿它去抓没有授权的第三方应用既不稳定也有合规风险。请把它限定在调试自己团队的应用或者有明确授权的测试场景里。5.3 iOS 下更现实的几个选择iOS 上绕证书固定要麻烦得多通常需要越狱环境或者对应用做重签名这两件事都不适合四处推广。我自己的经验是优先走这几条路如果调试自己的 App在 Debug 构建里配置信任任意证书或者临时关掉校验逻辑如果是分析合作方 SDK先联系对方要一个测试包或者让对方在测试环境关闭 HTTPS让后端临时把接口暴露成 HTTP只用于本地联调这也是我见过最快的临时方案。客户端联调阶段我强烈建议团队把“Debug 包默认允许抓包”写进工程规范。比起每个人都在真机上折腾证书Debug 包处理好后面省下的时间非常可观。5.4 比抓包更快的办法直接在代码层打日志这是很多人的盲区。如果你只是想确认自己的 App 某个接口到底发对了没有、响应是什么正确动作不是开抓包工具而是在网络库层面加日志。Android 的 OkHttp 有一个很经典的HttpLoggingInterceptor能打印请求地址、请求头、请求体和响应体。配置非常简单val loggingInterceptor HttpLoggingInterceptor().apply { level HttpLoggingInterceptor.Level.BODY }iOS 端可以在NSURLSession的代理方法里做统一日志或者干脆封装一层网络请求打点。后端如果有网关或日志平台查一下对应会话的调用记录往往比终端抓包更权威。抓包工具适合解决的是“黑盒问题”比如你不知道某个第三方 SDK 到底发了什么请求。如果是自己的代码先改代码打日志比配证书调代理快得多也少踩很多坑。6. 常见问题与排查技巧实录6.1 问题速查表现象可能的根因快速解决办法手机开启代理后所有流量都不通代理 IP/端口填错或电脑防火墙拦截确认电脑 IP 与端口关闭防火墙或加入放行规则证书下载页面打不开代理已接管浏览器流量但 SSL Proxying 没开先在 Charles 里 Allow*:*再访问下载地址iOS 安装证书后仍然无法解密没有在“关于本机”里打开完全信任设置 - 通用 - 关于本机 - 证书信任设置打开开关Android 7 抓不到 App 的 HTTPSApp 默认不信任用户证书有 root 用模块移证书到系统区无 root 用模拟器或改 App 的 networkSecurityConfig请求全部报证书错误大概率是 SSL Pinning参考第 5 节的 Hook/模拟器方案或让开发关闭 Pinning抓到请求但响应是乱码只代理了 HTTP没有解密 HTTPS在 Proxy - SSL Proxying Settings 里加入目标域名手机热点下 Wireshark 看不到流量选错网卡确认热点的虚拟网卡名称按流量排序找高流量网卡这张表整理自我自己踩过的各种坑。排查时先别急着改配置看现象落在哪一行往往几分钟就能定位。6.2 排查顺序比技巧更重要抓包失败时固定按“链路顺序”排查会快很多。链路是这样的手机流量 - Wi-Fi 代理 - 抓包工具端口 - TLS 解密 - App 证书校验。任何一环断了都不行。先确认流量已经到代理工具看 Charles 的 Connections 列表或访问日志如果手机请求出现了说明代理链路是通的再确认流量是否被解密看 Charles 里的请求有没有显示成明文 URL如果只是显示 CONNECT 隧道说明 SSL Proxying 没生效最后才怀疑证书信任和 SSL Pinning。很多新手一上来就怀疑 Pinng但实际上一百次抓包失败里有七八十次都是 SSL Proxying 没开或者证书没完全信任。把排查顺序固定下来能少走很多弯路。6.3 几条独家体验手机改了代理后不生效先把 Wi-Fi 关掉再重新连接比手动去开关代理稳定。Charles 的断点调试Breakpoints可以用来改请求参数在联调接口时比反复改代码效率高。把常用域名加到 Breakpoints 列表按需启用。抓包工具同一时间只开一个。电脑上 Charles 和 Fiddler 同时跑端口冲突的坑够你排查半天。用热点抓包时手机发热会比较明显因为所有流量都走电脑软路由转发了抓太久记得给手机休息时间。我自己现在的习惯是分三档应急就看手机本地抓包 App两分钟看个大概正式联调用 Charles 扫码代理加 SSL Proxying两分钟跑通遇到代理被检测、证书固定这类硬骨头直接换热点加 Wireshark 摸清链路再让开发配合从代码层打日志验证。很多时候省下来的不只是那半小时配置时间而是整个调试节奏的顺畅。希望这篇能帮你少踩几个坑下次再有人问“怎么抓接口”你可以直接把这几种方案丢过去而不是默默掏出手机开配。
返回列表