证书固定
固定了自身证书的应用无法通过 Busymate DevTools 解密——iOS 不行、Android 不行、通过代理也不行。这里精确说明每条抓包路径能看到什么、看不到什么,如何识别做了固定的主机,以及哪些东西依然有用。
每一个解密 HTTPS 的抓包工具原理都一样:向客户端出示一张自己签发的证书,客户端因为信任签发机构而接受它。证书固定则是应用声明只信任某一张特定证书或密钥,其他一概不认。当做了固定的应用遇到替代证书时,它会直接拒绝连接。这是应用的属性,不是工具里的开关,Busymate 提供的任何抓包路径都无法绕过它。
一个对此闭口不谈的工具会让你把整个研究会话浪费在一个根本不可能解密的目标上。所以本指南是一张地图而非绕行方案:面对固定主机时,iPhone 设备端抓包、Android 应用、桌面代理、已 root 的集群手机和 Chrome 连接器各自能给出什么,信息流如何标记它,以及哪些工作仍然可以完成。
你需要
本指南假设至少已有一条抓包路径把流量送进了你的仪表盘。
一部已配对并在抓包的手机或客户端——iPhone 或 Android 指南会带你到这一步。
你所研究应用的主机名,已加入 SSL 代理列表,这样至少会尝试解密。
打开的仪表盘信息流,检查筛选器触手可及。
检查该应用的授权:这些技巧仅适用于你拥有或被授权调试的应用和网站的流量。
按顺序
按顺序走完各条路径——每一条都会进一步收窄固定主机还能告诉你的信息。
- 01
弄清你的抓包路径依赖哪个信任库
在 iOS 上,解密取决于 Busymate 描述文件是否已安装并在「设置」中获得完全信任——之后手机上的每个应用都会信任该应用出示的证书,做了固定的应用除外。Android 有两个信任库:用户库,自 Android 7.0 起只有明确选择信任的应用才会采纳;系统库,所有应用都采纳,但只有 root 过的设备才能写入。桌面代理则依赖客户端机器或浏览器对其生成的证书机构的信任。
证书固定凌驾于这三者之上。做了固定的应用无论替代证书来自哪个库都会拒绝,所以把证书移到更强的库永远对固定主机无效。它只对那些拒绝用户库的应用有效。
- 02
在信息流中识别固定主机
你没有列入解密清单的主机会显示闭合的锁,只有主机名和请求计数——这是设计如此,不是固定。固定主机看起来不一样:它在你的列表里,解密已被尝试,连接却失败了,或者应用重试后放弃。仪表盘信息流的检查筛选器有三档——仅已解密、仅加密、仅 SSL 固定——最后一档正好把这些行单独筛出来。
另一个迹象是行为:主机一被解密,应用对该主机就停止工作;你把主机从列表移除,它立刻又能用了。如果两者都成立,你就找到了一个固定连接。
- 03
iPhone 设备端抓包:只有元数据,永远没有正文
iOS 应用在系统层面抓包,覆盖 Wi-Fi 和蜂窝网络,并解密你列出的主机。面对做了固定的应用,它仍会记录每一个连接——主机、时间、请求的数量和大小、当时生效的连接模式——但无法产出头部或正文,也没有任何开关能改变这一点。打开 MITM All Hosts 会解密所有未固定的主机;对固定主机它除了把它弄坏之外什么也做不了。
实用做法是把固定主机从列表中移除,让应用继续正常工作,保留应用的其他主机,然后读取未固定端点透露的信息。很多应用只固定认证或支付主机,其余都是开放的。
- 04
Android:未 root、已 root,以及证书固定的位置
在未 root 的 Android 手机上,应用生成的证书存在用户库中,因此只有你自己的调试版本和其他选择信任的客户端能被解密;其他所有应用只记录为元数据。在 root 过的设备上,证书可以装进系统库,HTTPS 便可在系统范围内解密——每个应用自己的证书固定除外。手机集群正是为此让它的 Android 设备运行在这一 root 级别。
所以 root 把一类不透明的应用——那些只是忽略用户库的应用——变成可读的,而对固定类应用毫无影响。Busymate 从不声称在未 root 设备上能系统级解密,也从不声称在 root 设备上能击败证书固定。
- 05
代理:同样的限制,外加它刻意拒绝的主机
桌面代理与证书固定的关系和手机应用一样:做了固定的客户端拒绝它生成的证书,连接失败。它还有一份短名单,无论你的 SSL 代理设置怎么写都绝不拦截——Apple 自己的 PKI 和吊销端点、Apple 证书链使用的证书状态响应器,以及 Busymate 自己的后端——因为拦截它们会破坏设备或仪表盘自己的实时连接。这些以原始隧道方式通过,这是有意为之,不是配置错误。
代理按设计原样放行的主机 text# Passed through as raw tunnels by the proxy, regardless of your SSL-proxy list: pkis.apple.com ocsp*.apple.com crl*.apple.com valid.apple.com ppq.apple.com # the DigiCert OCSP / CRL responders Apple's chain uses *.busymate.net # the dashboard's own backend + Realtime connection - 06
Chrome 连接器:证书固定不适用
有一条抓包路径完全不受证书固定影响。命令行连接器启动一个 Chrome 实例,通过 DevTools Protocol 在 TLS 的浏览器一侧读取它的流量。Chrome 与服务器之间的加密连接从未被触碰——没有替代证书可拒绝,没有东西要安装,也没有任何东西可供证书固定检测。那些代理无法打开其固定证书的服务商的登录流程,会被端到端完整记录,包括重定向和令牌。
代价是范围:它覆盖的是在那个 Chrome 里运行的内容,而不是原生应用。如果你关心的流程有网页版,这条路径能完整地看到它。
- 07
利用固定主机仍然能给你的东西
元数据并非一无是处。你仍能看到应用何时与固定主机通信、频率多高、交换数据多大、耗时多长,并把这些与周围已解密的调用关联起来。拦截规则在加密主机上仍能按主机级别匹配——路径不可见,但你可以让应用表现得像该端点不可达,这往往正是你想测试的失败模式。暂停功能能让该主机完全绕过代理,使应用照常工作,同时你检查其他一切。
而且你采取的每一步操作都在审计日志中,所以一次研究会话会留下记录:什么被解密了、什么被拦截了、什么被放过了。
可能出现
最耗时间的错误,是那些看起来像工具 bug 但其实不是的。
一添加它的主机,应用就崩了
这就是证书固定。把该主机从 SSL 代理列表移除——在 iOS 上随后重启 VPN 让隧道读取变更——应用就会恢复。它的其他主机保留在列表中。
MITM All Hosts 没有解锁这个应用
它本来就做不到。该开关扩大的是哪些未固定的主机被解密;它对应用固定的主机没有任何作用,而且会让手机上其他所有固定连接也一起失败。把它关回去。
给 Android 手机 root 也没用
root 会把证书移进系统库,这能说服那些忽略用户库的应用。它碰不到那种把证书与自己的固定值作比对的应用。
某个 Apple 系统主机在代理上从不解密
它在代理的绝不拦截名单上,因为解密它会破坏设备。没有什么需要修复;筛选器按设计把它显示为加密。
大家常问
Busymate 提供绕过证书固定的方法吗?
不提供。没有任何抓包路径会修改目标应用、注入代码或篡改它的信任逻辑。对于做了固定的原生应用,诚实的答案是元数据,加上它未固定主机透露的信息。
我怎么区分证书固定和只是忘了列入的主机?
未列入的主机显示闭合的锁,应用照常工作。固定主机已列入,解密已尝试,信息流的 SSL 固定筛选器能把它单独筛出,而且在你把它移出列表之前应用会一直失败。
对于做了固定的服务商的认证流程,我该选哪条路径?
如果该服务商有网页登录,就通过 Chrome 连接器来跑——TLS 在浏览器内终止,整个重定向链都会被记录。原生应用没有解密路径;抓取元数据以及周围未固定的调用。