Skip to content
字数
1002 字
阅读时间
4 分钟

#计网

HTTPS 抓包原理:中间人攻击 (MITM)

由于 HTTPS 的通信内容是经过加密的,常规的抓包工具无法直接解析其内容。因此,HTTPS 抓包的核心原理是实施一次“中间人攻击”(Man-in-the-Middle Attack, MITM)。

抓包工具(如 Charles, Fiddler)作为“中间人”服务器,对客户端和真实服务器进行双向欺骗:

  1. 对客户端伪装成服务器

    • 客户端发起 HTTPS 请求,中间人将其拦截。
    • 中间人向客户端伪造一张服务器证书(通常是自签名的),冒充自己是目标服务器。
    • 客户端(如果信任了中间人的根证书)会与中间人建立一个 HTTPS 连接。
  2. 对服务器伪装成客户端

    • 中间人以自己的名义,向真实的服务器发起一个正常的 HTTPS 请求。
    • 真实服务器响应后,中间人与真实服务器建立一个 HTTPS 连接。

如此一来,就建立了 客户端 <-> 中间人 <-> 服务器 的通信链路。其中,两段连接都是独立的、加密的,但中间人拥有两段连接的密钥,因此可以在中间层对数据进行解密、查看、修改,然后再加密发往另一端。

HTTPS 抓包原理图

关键前提:客户端必须信任中间人的根证书。这就是为什么在使用抓包工具前,需要在设备上安装并信任其提供的根证书的原因。

如何防范中间人抓包:SSL Pinning

为了防止这种基于信任链的攻击,移动应用普遍采用 SSL Pinning(SSL 证书锁定)技术。其核心思想是,客户端不再盲目信任操作系统或浏览器内置的所有 CA 根证书,而是在代码中内置一份“白名单”,只信任指定的证书。

常见的锁定方式有两种:

  1. 证书锁定 (Certificate Pinning)

    • 在客户端代码中硬编码服务器证书的指纹或整个证书。
    • 在建立连接时,客户端会比较服务器返回的证书是否与内置的证书完全一致。如果不一致,即使证书是由受信任的 CA 签发的,客户端也会立即断开连接。
  2. 公钥锁定 (Public Key Pinning)

    • 在客户端代码中硬编码服务器证书中的公钥。
    • 这种方式更灵活,因为只要私钥不变,即使服务器更新了证书(例如续期),只要公钥保持一致,客户端验证就能通过。

如何突破 SSL Pinning 进行抓包

既然 SSL Pinning 是在客户端代码中实现的证书校验逻辑,那么就可以通过技术手段 Hook(钩住)这些校验 API,强行改变其行为来绕过检查。

常用的方案是利用 Xposed 框架 + JustTrustMe 模块(在 Android 平台上):

  • Xposed: 一个强大的运行时 Hook 框架,可以在不修改 APK 的情况下,动态地改变应用的行为。
  • JustTrustMe: 一个 Xposed 模块,它专门用来 Hook 各种常见的 HTTP 请求库(如 OkHttp, HttpClient)中用于校验证书的 API。

工作原理:JustTrustMe 会找到执行证书校验的关键函数,并将其返回值强制修改为“校验通过”,从而欺骗应用程序,让它以为自己正在与一个受信任的服务器通信,即使对方(抓包工具)提供的是一个伪造的证书。

参考资料如何使用Xposed+JustTrustMe来突破SSL Pinning

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写