HTTPS 已经成为现代 Web 的标配,浏览器地址栏里的小锁图标让大多数用户相信连接是安全的。然而,HTTPS 并非不可攻破。在特定条件下,攻击者完全可以截获、解密甚至篡改看似安全的 HTTPS 流量。这就是 HTTPS 中间人攻击(Man-in-the-Middle,MITM)。理解它的原理,不仅能帮助开发者认清威胁模型,更能指导我们采取有效的防御措施。
HTTPS 到底保护了什么
要理解中间人攻击,先要回顾 HTTPS 的安全目标。HTTPS 在 HTTP 与 TCP 之间加入了 TLS 层,提供三项核心保障:
- 机密性:传输数据被加密,第三方无法直接读取。
- 完整性:数据在传输中若被篡改,接收方能够检测到。
- 身份认证:通过数字证书验证服务器身份,确保你连接的是真正的目标服务器。
中间人攻击的核心思路,就是破坏第三项——身份认证。一旦攻击者能让客户端相信“我就是目标服务器”,后续的加密和完整性保护就形同虚设,因为加密通道的两端变成了客户端与攻击者。
抓包工具:合法的中间人
很多人第一次接触 MITM 概念,其实是通过 Fiddler、Charles、mitmproxy 这类抓包工具。它们的工作原理与攻击者如出一辙:
- 客户端将流量代理到抓包工具;
- 抓包工具作为中间人,与目标服务器建立真正的 TLS 连接;
- 同时,抓包工具用自己的根证书动态签发一张目标域名的证书,出示给客户端;
- 如果客户端信任了抓包工具的根证书,就会接受这张伪造证书,TLS 握手成功;
- 此后,抓包工具可以解密、查看、修改双向流量。
这里的关键在于第 4 步。抓包工具之所以能工作,是因为我们主动把它的根证书安装到了系统或浏览器的信任库中。对于普通用户而言,这相当于亲手把“万能钥匙”交给了中间人。
攻击者如何实施 MITM
真实攻击场景中,攻击者无法要求受害者安装证书,因此需要另辟蹊径。常见手段包括:
ARP 欺骗与 DNS 劫持
在局域网中,攻击者通过 ARP 欺骗将自己伪装成网关,使受害者的流量经过攻击者主机。随后结合 DNS 劫持,把目标域名解析到攻击者控制的服务器。此时攻击者需要向客户端出示一张“可信”的证书,否则浏览器会报警。
伪造证书与流氓 CA
攻击者若能签发被浏览器信任的证书,MITM 就能悄无声息。历史上出现过多次 CA 被攻破或滥发证书的事件,例如 DigiNotar 事件导致大量伪造的 Google 证书流出。此外,某些企业会在员工电脑中预装内部根证书,用于合法监控,但同样的机制也可能被恶意利用。
降级攻击与 SSL Stripping
攻击者还可以在用户与服务器之间进行 SSL Stripping:将 HTTPS 请求降级为 HTTP,使用户以明文访问,从而完全绕过加密。HSTS 正是为对抗此类攻击而生。
客户端漏洞与恶意软件
如果攻击者能在用户设备上安装恶意软件或根证书,那么一切基于证书信任的防御都会失效。这也是为什么“设备本身被攻陷”通常被视为安全边界之外的问题。
防御一:HSTS 与安全传输策略
HTTP Strict Transport Security(HSTS) 通过响应头 Strict-Transport-Security 告诉浏览器:在未来一段时间内,对该域名的所有访问必须使用 HTTPS。这能有效阻止 SSL Stripping 和降级攻击。
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
配合 HSTS Preload 列表,浏览器可以在首次访问前就强制使用 HTTPS,进一步缩小攻击窗口。
防御二:证书透明化与监控
Certificate Transparency(CT) 要求 CA 将签发的证书公开记录到可审计的日志中。域名所有者可以监控 CT 日志,一旦发现为自家域名签发了异常证书,就能及时察觉并吊销。这大幅提高了流氓 CA 滥发证书的难度和暴露风险。
防御三:证书固定(Certificate Pinning)
对于移动 App 和部分高安全要求的客户端,证书固定是最强有力的防御手段之一。它的核心思想是:客户端不再盲目信任系统信任库中的所有 CA,而是只信任预先指定的证书或公钥。
常见实现方式有两种:
- 证书固定:将服务器证书的哈希值硬编码在客户端,只有匹配的证书才被接受。
- 公钥固定:固定服务器证书中的公钥(SPKI),即使证书更新,只要公钥不变仍可通过验证。
在 Android 中可通过 network_security_config.xml 配置,在 iOS 中可通过 URLSession 的认证挑战回调实现。其优势在于:即使攻击者拥有一个被系统信任的伪造证书,只要不是预先固定的那一张,握手依然会失败。
但证书固定也有代价:证书轮换变得复杂。如果固定了单张证书而忘记更新客户端,服务端换证后会导致大量客户端无法连接。因此实践中通常固定中间 CA 或备用公钥,并设置合理的过期策略。
防御四:应用层与运维加固
除了上述机制,还应做到:
- 全站启用 HTTPS,避免混合内容;
- 使用强加密套件,禁用过时的 TLS 版本;
- 对关键接口增加应用层签名或双向 TLS(mTLS);
- 监控证书吊销状态,及时响应异常;
- 提高用户安全意识,不随意安装未知根证书。
结语
HTTPS 中间人攻击的本质,是攻击者在客户端与服务器之间插入自己,并设法让客户端接受其伪造的身份。抓包工具是这一原理的“合法演示”,而真实攻击则借助网络劫持、流氓 CA 或设备入侵来实现。防御的核心在于:强制加密、公开审计、严格固定、持续监控。其中,证书固定为高安全场景提供了最后一道防线,但它需要与运维流程紧密配合,才能真正发挥价值。安全从来不是单一技术的胜利,而是层层设防、持续演进的结果。
未经允许不得转载:任鹏个人博客 » HTTPS 中间人攻击原理与防御:从抓包工具到证书固定


朋友圈点赞图在线生成源码