第三节:TLS/SSL握手、证书伪造与中间人攻击流程

讲MITM代理之前,有件事必须搞明白——TLS/SSL握手到底在做什么。

说白了,TLS/SSL就是在客户端和服务端之间盖一座加密隧道。没有这条隧道,数据就是裸奔。我刚开始接触这行时,觉得握手流程很抽象,直到自己抓包看了几次,才真正理解每一轮交换的意义。

TLS/SSL握手的三轮交换

先看一个标准的TLS 1.2握手流程。我用一张表来说清楚每一步在干什么:

阶段 方向 关键内容 背后作用
ClientHello 客户端 → 服务端 支持的TLS版本、加密套件列表、随机数 告诉服务端:我能用什么方式聊天
ServerHello 服务端 → 客户端 选定的TLS版本、加密套件、随机数 回复:咱们用这套方案
证书发送 服务端 → 客户端 服务器数字证书(含公钥) 证明我是谁,把公钥给你
密钥交换 双向 Pre-master secret(用公钥加密) 双方算出同一个会话密钥
握手完成 双向 ChangeCipherSpec + Finished 确认:之后数据全加密

注意,证书发送这一步是整个握手的命门。客户端拿到证书后,要验证它是不是真实可信的。如果这一步被绕过或欺骗,后面所有的加密都是空中楼阁。

我的理解:TLS握手本质上是一次身份确认 + 密钥协商。身份靠证书,密钥靠非对称加密搬运。

证书伪造——MITM的核心武器

正常握手时,客户端验证服务端证书,没问题就继续。但MITM代理要做的,恰恰是打断这个过程。

具体逻辑是这样的:

  1. 拦截连接:客户端以为自己在连目标服务器,实际上连的是MITM代理。
  2. 伪造证书:代理用自己的私钥签发一张假证书,冒充目标服务器。
  3. 欺骗客户端:把这张假证书发给客户端,只要客户端信任了签发这张证书的CA,就会接受。

说白了,客户端不是不验证证书了,而是验证通过了一个不该被信任的CA。

实操经验:我在项目里用过mitmproxy,它会在首次启动时生成一个本地的CA证书。你只要把这个CA导入操作系统的信任列表,它就等于有了「发假证不挨抓」的权限。

你想想看,如果客户端不信任这个CA,握手就会直接中断,并弹出大红框警告。这也是为什么真实环境里做MITM,第一步往往是让用户安装你自签的CA证书。

完整的中间人攻击流程

把TLS握手和证书伪造串起来,就是一条完整的攻击链路。嗯,这里我画了张图帮你理清思路。

中间人攻击——TLS握手拦截流程 客户端 MITM 代理 目标服务器 ① ClientHello ② ServerHello + 伪造证书 ③ 转发ClientHello ④ 真实ServerHello + 证书 客户端 MITM 代理 目标服务器 ⑤ 加密pre-master(用伪造公钥) ⑥ 解密+重新加密pre-master ⑦ 双向数据隧道建立 — 客户端↔MITM↔服务端(MITM可读明文) 核心:客户端用伪造公钥加密 → MITM可用私钥解密 → 数据透明 客户端认为在安全通信,实际数据已被中间人全程监听/篡改

看这张图。MITM代理在客户端和服务端之间,扮演了两个角色:

  • 面对客户端:它是「服务端」,用自己的假证书完成握手。
  • 面对真实服务端:它是「客户端」,用真正目标服务器的证书完成握手。

这么一来,MITM手里就有了两套会话密钥。客户端的加密数据,它能解开;发给服务端之前,它又能重新加密。这就是所谓的双向解密。

⚠️ 郑重提醒:这个技术本身没有善恶。在安全测试、流量审计、开发调试中,MITM代理是必备工具。但未经授权对他人网络做MITM,就是违法行为。

为什么MITM能成功?

你可能会问:客户端不是会验证证书吗?问题出在信任链的起点。

正常情况下,客户端只信任预装的操作系统根证书列表。但如果你手动把一个自签CA证书加入了这个列表,就相当于告诉客户端:这个人发的证,一律承认。

我曾经遇到过一个案例:某公司内部研发环境,要求所有开发者安装一个内部CA,用于访问内网服务。开发人员图省事,把这个CA也加到了浏览器信任列表里。结果有人在内网搭了个伪造的git服务器,名字一模一样,证书也是用那个内部CA签的——好家伙,凭据全被截走了。

这就是信任被滥用的典型场景。

对抗MITM的手段

回过头来,我们站在防守方想想。怎么防止这种攻击?

手段 原理 效果
证书透明度(CT) 所有公开证书必须记录在公开日志中 伪造证书很难不被发现
证书固定(HPKP / Expect-CT) 客户端记住服务端真正的公钥指纹 换了证书直接拒绝连接
双向TLS(mTLS) 客户端也要出示证书 代理无法同时伪造两端身份
不要随意安装CA 从源头切断信任链 最简单的有效手段

我个人习惯是在做MITM代理测试时,用一台专门的虚拟机,装好自签CA。测试完就恢复快照,绝不让那个CA留在日常工作环境里。你想想看,要是哪个浏览器插件偷偷往系统里塞了一个CA,你的HTTPS流量就等于裸奔了。

我的建议:把这几个TLS握手状态记牢。做MITM代理调试时,百分之八十的故障都出在握手中断、证书不匹配、或CA未安装这三件事上。抓包看出来是哪一步崩了,问题就解决了一半。

最后说一句

TLS/SSL握手是MITM代理的理论根基。证书伪造是实操入口。中间人攻击流程是串联逻辑。这三件事不搞明白,后面配置代理、过滤流量、提取数据全都站不住脚。