1、TLS协议概述
大家好,我是老尹,干了十几年网络安全。今天开始讲 TLS 会话密钥边界配置,第一站先把 TLS 的底子打牢。你想想看——要是连 TLS 是什么、怎么握手、版本怎么选都搞不清,后面那些边界配置就是空中楼阁。
TLS 协议历史与版本
TLS 的前身是 SSL,Netscape 在 90 年代搞出来的。那时候 Web 刚火,网上购物、登录都需要加密,SSL 1.0 压根没公开发布过。我印象里 SSL 2.0 是 1995 年发布的,但漏洞太多,很快就被淘汰了。
真正让加密通信普及的是 SSL 3.0(1996)。可是呢,它也有设计缺陷——比如 POODLE 攻击,说白了就是填充漏洞。后来 IETF 接手,把 SSL 3.0 做了个规范化改进,改名叫 TLS 1.0(1999),其实和 SSL 3.0 差别不大。
| 版本 | 发布时间 | 核心问题 / 特点 | 当前状态 |
|---|---|---|---|
| SSL 2.0 | 1995 | 弱 MAC、中间人攻击 | 禁止使用 |
| SSL 3.0 | 1996 | POODLE 漏洞 | 禁止使用 |
| TLS 1.0 | 1999 | 与 SSL 3.0 不兼容,实际改进有限 | 已废弃(PCI DSS) |
| TLS 1.1 | 2006 | 修复 CBC 攻击,增加显式 IV | 很少使用 |
| TLS 1.2 | 2008 | 支持 SHA-256、GCM、AEAD | 主流 |
| TLS 1.3 | 2018 | 简化握手、去掉不安全算法、0-RTT | 推荐使用 |
关键判断:我建议你现在做新项目直接锁死 TLS 1.2 和 1.3,旧版本一律关掉。我曾经在一个金融客户现场排查了三天,最后发现是某个负载均衡器偷偷协商到了 TLS 1.0,导致中间人攻击暴露。
TLS 1.2 是目前兼容性最好的版本,几乎所有的客户端和服务端都支持。但 1.3 才是未来——握手从 2-RTT 降到 1-RTT,还在特定场景支持 0-RTT(但这个有重放风险,后面我会细讲)。
TLS 在网络安全中的作用
说白了,TLS 就干三件事:加密、认证、完整性。但实际落地时,每件事都有坑。
- 加密——防止数据被窃听。对称加密用于实际数据,非对称加密用来安全交换对称密钥。嗯,这就是会话密钥的由来。
- 认证——通过数字证书确认对方身份。我遇到过有人关掉了客户端证书校验,结果被中间人轻松劫持。
- 完整性——通过 MAC 或 AEAD 防止数据被篡改。记住,光加密不验证完整性,等于没加密。
避坑指南:我曾经帮一个电商团队做安全审计,他们用了 TLS 但忘了强制证书校验。攻击者伪造了一个自签名证书,就能拦截所有交易数据。嗯,从那以后我在每个项目里都会加上一行代码:ssl_context.verify_mode = ssl.CERT_REQUIRED。
TLS 在网络协议栈里位于传输层(TCP)和应用层(HTTP、SMTP、FTP)之间。它不关心上层是什么协议,只负责把字节流加密后再交给 TCP 发送。所以 HTTPS、SMTPS、FTPS 都离不开它。
TLS 握手流程概览
握手就是客户端和服务端互相打个招呼,商量用啥加密算法、交换证书、生成会话密钥。拿 TLS 1.2 全握手来说,大致分这么几步:
- ClientHello:客户端说“我支持 TLS 1.2,密码套件列表有这些,随机数在这”。
- ServerHello:服务端回复“好,我们用 TLS 1.2,密码套件选这个,随机数给你”。
- Certificate:服务端发自己的数字证书链。
- ServerKeyExchange(可选):如果是 DHE 或 ECDHE 密钥交换,这里发参数。
- ServerHelloDone:服务端说“我发完了”。
- ClientKeyExchange:客户端把用服务端公钥加密的预主密钥发过去(RSA),或者发自己的 DH 公钥(DHE/ECDHE)。
- ChangeCipherSpec:双方切换加密模式。
- Finished:双方发一条加密后的消息,验证整个握手没被篡改。
画了一张流程图,你可以直观看到数据流动:
你可能会问:“怎么没有 ChangeCipherSpec 和 Finished?”嗯,这两个消息是握手后半段的加密切换关键。ChangeCipherSpec 是个协议层标记,告诉对方“我要开始加密了”。接着双方各自发 Finished 消息,内容是握手过程中所有消息的哈希值。如果双方都能解密并校验成功,握手才算完成。
注意:我见过有人在 Nginx 里把 ssl_protocols 写成了 TLSv1 TLSv1.1,忘了加 TLSv1.2。结果压测时大量握手超时,因为现代客户端普遍优先协商高版本。最后发现是配置没跟上时代。
关于密码套件,我单独讲一下。TLS 1.2 支持几十个套件,但真正安全的没几个。我个人习惯用 ECDHE-ECDSA-AES128-GCM-SHA256 或者 ECDHE-RSA-AES256-GCM-SHA384。为什么?因为 PFS(前向安全性),就算私钥泄露,历史会话也解密不了。千万别再用 RSA 密钥交换的套件了——那玩意儿没有 PFS。