什么是中间人攻击?TLS 和证书如何防止 MITM?
简化版
中间人攻击是攻击者夹在客户端和服务端之间,窃听、篡改或分别冒充双方通信。TLS 防 MITM 的关键不只是加密,还包括证书验证:客户端要验证服务器证书链、域名、有效期和吊销状态,确认公钥确实属于目标站点。
详细版
如果只有密钥交换但没有身份认证,攻击者可以分别和客户端、服务端建立两条加密连接,两边都以为安全,实际明文被中间人看到。TLS 通过 CA 证书链和域名校验绑定“域名”和“服务器公钥”,客户端信任 CA,验证证书后才使用服务器公钥协商密钥。
防御包括全站 HTTPS、正确校验证书、不忽略证书错误、HSTS、防止降级、证书透明度监控、移动端谨慎做证书 Pinning。
完整版教学
一、中间人攻击攻击的是什么
MITM 攻击不是简单窃听,而是攻击者站在通信中间,同时对客户端伪装成服务端,对服务端伪装成客户端。
client <-> attacker <-> server
如果协议没有认证,客户端可能把密钥交给攻击者,服务端也可能以为攻击者就是客户端。加密本身不能证明“对面是谁”。
记忆钩子:加密回答“别人看不看得懂”,证书认证回答“我到底在和谁说话”。
二、为什么只有加密不够
Diffie-Hellman 这类密钥交换能让双方在公开网络上协商密钥,但它默认不验证对端身份。攻击者可以分别和两端做两次密钥交换。
client <--key1--> attacker <--key2--> server
客户端看到的是加密连接,服务端看到的也是加密连接,但攻击者能在中间解密再加密。这就是为什么 TLS 必须把密钥交换和证书认证结合起来。
三、证书链如何绑定身份
服务器证书里包含域名、公钥、有效期和签发者。客户端验证证书链是否能追溯到本机信任的根 CA,并检查访问域名是否匹配证书。
| 校验项 | 作用 |
|---|---|
| 证书链 | 确认由可信 CA 签发 |
| 域名 | 确认证书属于目标站点 |
| 有效期 | 防过期证书继续使用 |
| 用途 | 确认证书可用于服务器认证 |
任何一项失败都不应忽略。点击“继续访问”就是在绕过身份认证。
四、TLS 握手中的防 MITM 流程
简化流程可以理解为:服务器出示证书,客户端验证证书,双方协商密钥,后续数据用对称密钥加密。
1. ClientHello
2. ServerHello + Certificate
3. client verifies certificate
4. key exchange -> shared secret
5. encrypted HTTP
TLS 1.3 让握手更快,但“先验证身份,再建立安全通道”的原则没有变。
五、常见 MITM 场景
公共 Wi-Fi、恶意代理、DNS 污染、ARP 欺骗、企业代理根证书、用户安装恶意证书,都可能制造中间人位置。不同场景防线不同。
DNS 被污染 -> 访问错误 IP
证书不匹配 -> 浏览器应报警
用户安装恶意根证书 -> 本机信任体系被改变
所以浏览器的证书错误提示非常重要,不能教育用户随便忽略。
六、HSTS 和证书 Pinning
HSTS 能防止用户从 HTTP 被降级或劫持到明文连接。证书 Pinning 是客户端只信任特定证书或公钥,常见于移动 App,但配置错误会导致证书轮换困难。
Strict-Transport-Security: max-age=31536000; includeSubDomains
Pinning 安全性强但运维风险也高。Web 站点更多依赖 CA 体系、HSTS、证书透明度和自动化证书管理。
七、开发和测试里的危险习惯
很多 MITM 风险来自开发阶段留下的坏习惯,比如关闭证书校验、信任所有证书、忽略 hostname 校验。测试环境可以临时使用自签证书,但客户端必须明确安装测试 CA,而不是在代码里写“全部信任”。
bad: verify=False
bad: trust all certificates
good: trust specific test CA
一旦这类配置进入生产,攻击者只要能站到链路中间,就可以伪造任意服务器证书。
八、排查证书问题的顺序
证书问题要按链路看:域名是否正确,证书 SAN 是否包含该域名,中间证书是否完整,证书是否过期,客户端时间是否正确,是否被代理替换证书。
domain -> SAN -> chain -> expiry -> client clock -> proxy/root CA
很多“HTTPS 不通”不是 TLS 协议问题,而是证书链缺中间证书、负载均衡配错证书或客户端时间偏差。
九、常见误区与追问
- 误区:只要用了加密就不会被中间人。 没有身份认证的加密可能只是和攻击者加密。
- 误区:证书错误可以先忽略。 证书错误可能意味着身份无法确认,继续访问会暴露通信。
- 误区:自签证书和正规证书一样安全。 自签证书需要客户端预先可信分发,否则无法防伪造。
- 追问:证书验证主要看什么? 证书链、域名、有效期、用途和吊销信息。
- 追问:HSTS 防什么? 防浏览器降级到 HTTP 或首次之后的明文访问。
- 追问:企业代理为什么能解 HTTPS? 终端安装了企业根证书,代理可签发被本机信任的站点证书。
- 追问:Pinning 有什么风险? 证书轮换或误配置可能让客户端无法连接。
十、加强记忆
MITM 的核心是“你以为对面是服务器,其实中间站了攻击者”。TLS 防 MITM 靠两步:先用证书链和域名校验证明服务器身份,再协商会话密钥加密数据。加密解决看不懂,证书解决对面是谁;少了身份认证,加密也可能加给攻击者看。