首页 / 资讯中心 / 文章详情

安卓模拟器抓包环境搭建:HTTPS证书与代理配置全攻略

安卓模拟器抓包环境搭建:HTTPS证书与代理配置全攻略 ★ FEATURED ARTICLE
安卓模拟器里的抓包环境我前前后后折腾了好几轮。从最开始照着教程一顿操作却连请求都看不到到后来把 HTTPS 证书、代理链路、系统证书目录这些环节理清楚中间踩的坑确实不少。这篇文章就把我现阶段的完整方案写下来包括模拟器选型、代理工具配置、证书处理、常见报错排查以及几处常规文档极少提到的细节希望能帮你一次把环境搭明白。先说结论一个可用的安卓模拟器抓包环境本质上就三件事——让模拟器把网络请求送到代理工具让代理工具能解密 HTTPS 流量让目标应用愿意信任这把解密用的证书。听起来简单但每一件都有版本差异和坑等着你。1. 抓包环境到底在解决什么问题很多人第一次接触抓包是调试接口联调的时候发现“请求明明发出去了后端怎么没收到”或者“后台返回了数据APP 这边就是解析不出来”。这时候与其靠猜不如直接把网络层发生的每一件事看清楚——请求头、请求参数、响应体、状态码、耗时全部摆在面前问题定位会快很多。除了联调排障抓包还有一个重要的用途做流量内容分析。比如你想知道自己开发的 APP 在启动阶段到底访问了哪些服务、上传了哪些非必要数据、某个页面请求是否携带了冗余字段这些光靠代码审查很难完全掌握抓包能给你一份客观的记录。另外做竞品分析或者第三方 SDK 调研时抓包也是了解“某个功能背后调用了什么接口”的常用手段。为什么选择安卓模拟器而不是真机我个人的体会是三点。第一模拟器可以随时创建不同 Android 版本的环境我本地就同时保留了 Android 9、10、11 几个镜像遇到证书信任、明文流量限制这类跟版本强相关的问题可以快速对比验证。第二模拟器支持快照抓包环境配好后保存一份快照以后随时恢复不用每次重新配。第三很多模拟器镜像本身就带 root 权限这在后面把用户证书塞进系统证书目录时会非常方便真机想干这事儿往往得先解锁 Bootloader折腾成本高不少。当然模拟器也有短板。最明显的是 ARM 架构的应用在 x86 模拟器上运行效率低有些冷门应用甚至直接不兼容。但单纯为了抓包调试接口九成场景下模拟器完全够用。2. 工具选型模拟器与抓包工具的搭配思路先说我目前在用的组合Windows 主机 安卓模拟器 桌面版抓包代理工具。这套方案适合大多数日常开发场景。模拟器这边我试过 Android SDK 自带的 Emulator 和几款常见的第三方模拟器。SDK 自带模拟器的好处是纯净、跟 ADB 配合最顺畅坏处是冷启动慢、对 x86 之外的镜像支持一般。第三方模拟器胜在开箱即用、性能调校好但有些版本会预装一堆你用不到的应用抓包时流量杂音比较多。我的建议是如果你要抓的应用是普通商业应用用第三方模拟器的稳定版就行注意把里面的内置应用能卸则卸;如果你是做系统级调试或者要测不同 Android 版本兼容性优先考虑 SDK 自带模拟器配合 AVD 镜像管理会顺手很多。抓包工具这边桌面代理类工具是我最常用的。它的核心工作方式是在本机监听一个端口模拟器把 HTTP/HTTPS 请求转发到这个端口工具再把请求转发给真正的服务器同时把响应返回给模拟器。整个过程里代理工具是中间人既能记录流量也能解密 HTTPS。这类工具的代表有 Charles、Fiddler、mitmproxy。Charles 和 Fiddler 都是图形界面请求列表、断点、重写这些功能非常直观mitmproxy 是命令行工具脚本定制能力强适合批量自动化场景。还有一类方案是云端真机抓包平台。它们的优势是测试机型多、不需要自己维护环境缺点是流量要绕到云端服务器涉及敏感数据的场景要慎重而且难以跟本地的调试工具链无缝衔接。我的经验是本地环境搞不定的极少数机型兼容问题才考虑云端方案日常开发完全不必要。选型还有一个容易忽略的角度你抓包之后打算拿数据干什么。如果只是肉眼看看接口字段图形界面工具够了如果想做统计、比对、自动化回归那一定要选一个能提供脚本接口或命令行模式、能导出结构化数据的工具后面会专门说这一块。3. 环境配置全流程从代理设置到首次抓包下面这套流程我按“能抓到 HTTP”和“能解 HTTPS”两个阶段拆开。先把 HTTP 流量跑通建立了信心再处理证书排查起来思路清晰很多。3.1 启动抓包工具并开启代理监听打开抓包工具后第一步是让它处在“代理模式”。桌面版工具一般默认会监听本机 127.0.0.1 的某个端口比如 8888 或 8080。关键是把“SSL 解密”功能打开这样工具才能生成自己的 CA 证书并在后续用它来解密 HTTPS 流量。工具界面上通常有一个“SSL Proxying / SSL 解密”开关打开后配置一个或一组允许解密的域名规则。刚开始调试时可以直接填*代表所有域名都走解密后续整理清楚了再缩小范围。打开监听之后确认一下本机防火墙是否允许外部设备接入这个端口。模拟器虽然跑在电脑上但从网络栈角度来看它连接这个端口时以“局域网设备”的身份出现Windows 的防火墙要放行该端口的入站连接。这一步漏掉的典型现象就是模拟器里网络访问超时但工具界面一直收不到任何请求。3.2 把模拟器的网络请求指向代理模拟器里设置代理有两条路图形界面设置和 ADB 命令设置。第三方模拟器一般都在“设置 - WLAN”里有长按 Wi-Fi 网络、修改代理的入口这里填主机的局域网 IP不是 127.0.0.1因为模拟器自身就是一个独立网络设备和工具的监听端口即可。更通用的是用 ADB 命令在主机终端里执行adb shell settings put global http_proxy 192.168.1.10:8888把 IP 换成你主机的实际局域网地址。这个命令对所有模拟器都有效而且可以随时用下面的命令恢复无代理状态adb shell settings put global http_proxy :0这里有个容易混淆的点127.0.0.1在模拟器里指向模拟器自己不是你的主机。所以代理地址必须填主机的局域网 IP。如果你不确定主机 IP可以用ipconfigWindows或ifconfigmacOS/Linux查一下。还有一个小细节有些模拟器提供了“高级设置 - 网络 - 主机映射”之类的选项可以把特定域名解析到指定 IP。这个一般情况下用不到但遇到应用做了 DNS 防劫持或者你需要模拟特定环境的域名解析时能派上用场。3.3 验证 HTTP 流量已经能看见此时先在模拟器浏览器里访问一个普通的 HTTP 网站如果模拟器内置了浏览器的话或者随便打开一个你已知使用 HTTP 协议的应用去抓包工具界面看请求列表。能看到请求项说明代理链路已经通了。如果这里就不通回头检查 IP、端口、防火墙别急着往下走否则后面的 HTTPS 问题会和网络问题混在一起排查起来很痛苦。这一步顺利了再打开一个 HTTPS 页面。你会发现 URL 能看到但请求体和响应体是乱码或者直接就标成了“加密内容”这就到了第二座山证书。3.4 安装代理工具的 CA 证书要让代理工具能解密 HTTPS核心机制是工具生成一对 CA 根证书当模拟器发起 HTTPS 连接时工具临时充当服务器用自己的证书由 CA 签发与模拟器完成 TLS 握手同时工具作为客户端与真实服务器建立另一条 TLS 连接。模拟器必须信任工具的 CA 证书否则握手时就会报证书校验失败。安装证书时先在模拟器浏览器里访问http://主机IP:端口工具一般会在网页里提供一个下载 CA 证书的链接。下载后进入“设置 - 安全 - 加密与凭据 - 安装证书”选择“CA 证书”找到下载的文件安装即可。这里就进入 Android 版本的深水区了Android 7.0 及以上默认情况下用户安装的 CA 证书只对用户自身的应用生效系统应用和绝大多数第三方应用默认不信任用户证书。这意味装完证书后你会发现系统自带应用能解密但你真正想抓的那个第三方 APP 依然死都不肯握手成功。这一节的实操结论是先把环境链路打通别一上来就追求全局解密。你安装完证书后用浏览器再看一次 HTTPS 网站如果能看到明文内容说明证书链路本身没问题剩下的只是目标应用信任策略的问题下一节专门讲。4. 证书信任机制的深水区版本差异与应对这是整个抓包环境里最曲折的部分。安卓版本、目标应用是否做了证书校验、应用是否允许明文流量这三个因素交织在一起会产生非常多的组合情况。4.1 Android 各版本的信任策略我用表格整理一下常见版本的差异Android 版本用户证书是否被第三方应用信任明文 HTTP 流量是否被允许典型影响6.0 及以下信任默认允许装好证书基本就能解 HTTPS7.0 - 8.x默认只信任系统证书默认允许明文多数第三方 APP 不受用户证书影响需特殊处理9.0 - 11同上默认禁止明文流量HTTPS 和 HTTP 都可能需要额外配置12同上默认禁止明文流量部分应用默认启用更严格的网络安全配置注意“用户证书”与“系统证书”的区别。Android 有两套证书库用户证书库里面的证书普通应用默认不碰系统证书库里的证书是系统启动时加载的、所有应用默认信任的集合。我们把工具 CA 想办法放进系统证书库就能骗过“不信任用户证书”那一条规则。4.2 将用户证书置入系统证书库如果你用的模拟器镜像有 root 权限那操作起来不复杂。先计算出证书文件的哈希值openssl x509 -inform PEM -subject_hash_old -in 用户证书文件.pem | head -1会输出一串 8 位的十六进制数字。将 PEM 格式的证书重命名为这串数字.0然后把它复制到系统的证书目录。常见做法是先以读写方式重新挂载系统分区adb root adb remount adb push 哈希值.0 /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/哈希值.0之后重启模拟器。重启后从“设置 - 安全 - 加密与凭据 - 系统证书”里能看到它说明已经是系统级证书了。这一步做完绝大多数普通应用的 HTTPS 流量都能被你解密。这里有一个经验之谈如果模拟器用的不是标准系统分区而是动态分区结构adb remount可能会失败。这种时候可以先执行adb disable-verity再重启模拟器然后再adb remount。我最初在这个环节卡了很久后来发现是分区只读问题。4.3 应用自身的校验策略证书放到系统库可以覆盖“不信任用户证书”的情况但覆盖不了应用自己做的额外校验。第一类常见的是证书锁定。应用在代码里写死了允许的证书指纹即使你的 CA 在系统信任范围内只要实际服务器的证书指纹跟代码里的不一致应用依然拒绝通信。对付这种应用常规方案是无解的除非你能在应用代码里修改校验逻辑后重打包。从合规角度说我不建议为了抓包而强行绕过应用的安全设计——如果你本来就是该应用的开发方直接改调试配置或者提供测试环境地址更方便如果是第三方应用更合理的做法是通过它的网络分析模式、日志开关等官方途径。第二类是网络安全配置。Android 9 之后应用可以通过network_security_config.xml明确指定自己信任哪些 CA、是否允许明文流量。一个平时的做法是在应用的AndroidManifest.xml里声明networkSecurityConfig然后在配置文件里加上类似下面的片段network-security-config base-config cleartextTrafficPermittedtrue trust-anchors certificates srcsystem / certificates srcuser / /trust-anchors /base-config /network-security-config这里system和user都加进去意味着应用同时信任系统和用户证书。作为应用开发者这是调试阶段的正当做法。但如果你抓的第三方应用本身就把cleartextTrafficPermitted设成了 false且没有 user 信任锚点那么明文 HTTP 请求同样会被应用直接拒绝表现为请求尚未发出就报错。4.4 一个现实建议抓包环境不要强求“通杀”把上面这些因素排列组合一下你会发现不存在一个证书、一次配置就能让所有应用都乖乖被解密的万能方案。现实的做法是根据你的目标应用倒推需要哪一项配置。比如你只是抓自家应用的接口那直接在应用里加 user 信任锚点然后把用户证书装上就完事不需要搞系统证书。如果你要做的是第三方应用的流量分析那就得走系统证书路线同时接受某些做了证书锁定的应用破解不了、某些高版本系统上明文流量看不到的现实。这种“够用就好”的思路能帮你节省大量时间。我见过不少同行为了解一个无关紧要的 HTTPS 流量在提权、重打包上折腾两三天最后发现目标接口换成 HTTP 测试地址或者直接看服务端日志更快。5. 高频问题与排查技巧实录抓包环境的坑基本集中在“网络通不通”“证书信不信”“流量看不看得到”三个层面我把遇到频率最高的几种情况整理成清单。5.1 代理明明配了应用就是不走代理这个问题在国产应用里特别常见。很多应用内置了网络库其连接策略是“绕过代理直连服务器”具体表现为系统代理设置了浏览器访问正常但目标应用的网络请求就是不在抓包工具里出现。排查思路分两步。第一步把代理方式从“全局代理”改成“透明代理”。透明代理不依赖系统代理设置而是通过网关把 80/443 端口的流量强制转发到代理工具的监听端口。这需要模拟器的网络实现层面配合不是所有模拟器都支持改网关地址具体要看模拟器是否允许自定义网络桥接模式。第二步是检查应用的源码逻辑如果是自家应用查一下网络库是否设置了ProxySelector或者用了直连的 socket 路径。5.2 装好系统证书后部分应用仍然连不上网这通常是应用做了证书锁定或者是应用内部单独维护了一套受信任的 CA 列表不读系统证书库和用户证书库。我遇到过一个数据上报 SDK它连的域名证书校验逻辑是自己写的只认预埋在 SDK 里的几个公钥系统怎么加证书都没用。这时候我用过一个相对稳妥的排查手段先用抓包工具把应用连接过程中 TLS 握手阶段的报错信息记录下来看看具体是“证书链不可信”还是“证书指纹不匹配”。前者你还有戏继续往系统证书方向努力后者基本可以直接宣布这条路走不通换思路——找应用提供的测试模式、后台导出日志或者直接看服务端接入层记录的请求参数。5.3 抓包工具丢了一部分请求请求列表里看起来有缺失十有八九是工具只对配置了 SSL 解密规则的域名做了完整记录其他域名只记了请求行没记内容或者干脆过滤掉了。把工具的 SSL 解密规则从“部分域名”临时改成“*”再对比一下是否所有请求都出现了。还有一种可能部分并发请求到达顺序错乱工具界面默认排序方式掩盖了某些请求按时间戳重新排序就好。5.4 模拟器里网页访问正常但应用报“网络异常”这个现象通常指向明文的 HTTP 流量被系统阻止。如果你需要抓的目标域名恰好是 HTTP就算系统全局允许明文个别应用对明文流量的策略也可能收紧。一个可行的权宜之计是检查模拟器的系统属性adb shell settings put global http_proxy 主机IP:8888如果应用明确校验了明文流量那基本无解。这种情况下比较现实的选择是调整测试环境——让服务端在测试环境提供 HTTPS 地址你用抓包工具解密 HTTPS 即可。现象优先排查点高阶尝试浏览器能通、应用不通系统代理是否对应用生效透明代理/网关转发HTTPS 网页乱码证书没装好用户证书转系统证书部分应用连不上证书锁定、内部 CA 列表抓 TLS 握手日志判断类型应用报网络异常明文流量策略换 HTTPS 测试地址6. 把抓包从“看看”升级成“能用”脚本化导出与分析环境稳定之后日常使用里占用我时间最多的问题变成了“怎么把抓到的数据变成可复用的证据或测试用例”。如果一个一个拷屏幕、手动翻响应体效率太低了。先说最基础的批量导出。主流桌面抓包工具都支持把会话保存成日志文件常见格式包括遵循 HTTP Archive 规范的.har文件。HAR 的本质是 JSON把请求、响应、时间线、Cookie 都结构化了。拿到 HAR 之后用脚本做二次处理非常顺手。比如用 Python 写一段几十行的脚本把里面所有 POST 请求的 URL 和 body 过滤出来生成一份接口清单或者按响应时间倒序找慢接口。这比在工具界面里肉眼看高效得多。一个可复用的示例是写一个函数从 HAR 里提取“请求路径 - 请求方法 - 请求参数 - 响应状态码 - 响应体摘要”然后汇总成表格。这样每次接口改动后跑一遍抓包、导一次 HAR、生成一份对比报告就能快速看出哪些接口的参数结构变了。我第一次把这套小脚本跑通的时候正好赶上项目前后端做大规模字段调整全靠这份报告在上线前把十几个不兼容点提前揪出来的。再往上走一步是接入命令行工具。mitmproxy 可以编写脚本在流量经过时实时修改请求、读取响应、对特定条件做断言。比如我可以写一个脚本规定“当 API 路径里包含某关键词时必须携带指定的鉴权头否则打印告警”。这种检查原本靠人为抓包事后看现在在流量层面就自动拦一道对接口规范落地特别有用。把抓包环境变成自动化工具链的一部分才刚刚开始。更复杂的用法包括结合接口测试框架把 HAR 里的请求模板转成自动化用例或者用抓包数据做线上流量回放验证新版本服务端兼容性。这些都是“抓包环境搭建好之后”才谈得上的事。7. 写在最后的经验与提醒整理这套环境的过程中我最大的感触是抓包环境的复杂度主要来自 Android 生态的碎片化而不是某一个单一环节。同一个证书配置在 Android 7 上生效在 Android 10 上可能需要换一种路径同一个代理设置在模拟器 A 上全通在模拟器 B 上就得额外放行防火墙。所以搭建的时候最好固定一套主用版本组合把流程跑通、记录好再横向扩展到其他版本而不是一上来就追求大而全。另外有几个小建议供你参考。第一尽量在模拟器里集中测试应用少开无关应用抓包结果会干净很多也避免把系统预装应用的上报流量误当成目标流量。第二配置完成后保存一个模拟器快照下次直接恢复证书、代理设置都不用重来。第三抓包涉及流量数据里面大概率包含账号标识、接口鉴权信息等敏感内容本地处理没问题但如果要分享给其他人记得先脱敏去掉 Cookie 和 Authorization 头。我实际操作中还有一个习惯把常用的代理配置、证书安装命令、常见报错截图统一整理成一个 Markdown 文档放在本地。每次新装一个模拟器或者换一台电脑照着文档走一遍基本十分钟就能恢复完整环境。这套流程我前前后后用了快两年暂时没遇到文档覆盖不了的场景。最后说一个很玄但确实有用的细节很多时候模拟器抓包不顺畅不是技术问题而是你忘了看代理工具的“是否正在监听”状态。工具开久了卡死、端口被占用、证书文件被浏览器拦截没有真正下载到本地这类低级问题占了排查时间的一大半。所以遇到问题先从头校验一遍链路再往深处找原因不要一上来就怀疑是证书信任机制这类高阶问题。希望这份环境探索记录能帮你少走几趟弯路。
阅读完成 · 觉得有帮助?
咨询建站