1. TLS 协议概述:发展历史、作用、基本架构与分层模型
大家好,欢迎来到这门实战课。第一讲,咱们先把 TLS 的底牌翻一翻。
你可能每天都在用 HTTPS,但「TLS 到底解决了什么问题?」「它从哪来的?」「内核长什么样?」——这些问题,今天一次性讲清楚。
1.1 发展历史:从 SSL 到 TLS 1.3
TLS 的前身叫 SSL,网景公司在 90 年代搞出来的。那时电商刚起步,信用卡号明文在网络上跑,太吓人了。SSL 1.0 没发布就废了,SSL 2.0 和 3.0 才真正落地。
我记得刚工作那会儿,还有不少老系统跑 SSL 3.0。后来爆出 POODLE 漏洞,才彻底淘汰。
简单列一下关键节点:
| 版本 | 发布年份 | 关键变化 | 当前状态 |
|---|---|---|---|
| SSL 2.0 | 1995 | 首个公开发布版本,缺陷很多 | 已废弃 |
| SSL 3.0 | 1996 | 修复大量问题,成为 TLS 基础 | 已废弃(POODLE 漏洞) |
| TLS 1.0 | 1999 | 改名 TLS,兼容 SSL 3.0 | 已废弃 |
| TLS 1.1 | 2006 | 防 CBC 攻击、增强 IV | 已废弃 |
| TLS 1.2 | 2008 | 支持 AEAD、SHA-256、指定密码套件 | 广泛使用 |
| TLS 1.3 | 2018 | 重构握手、移除不安全算法、0-RTT | 推荐升级 |
核心要点: 现在线上环境,最低也得支持 TLS 1.2。TLS 1.0/1.1 必须关掉,否则等着被安全审计锤吧。
1.2 作用:TLS 到底干了几件什么事?
说白了就三个目标——这三点也是所有密码通信协议的根本。
- 机密性: 数据在传输过程中,只有通信双方能看懂。中间人截获了也是一堆乱码。
- 完整性: 数据在传输中没被篡改。你发了个“转账100”,中间人改成“10000”?TLS 会直接断开连接。
- 身份认证: 你访问的是真的服务器,不是冒牌货。靠的是 X.509 证书体系。
额外提一个很多人忽略的点——向前安全性。我的建议是:密码套件必须支持 PFS(完美前向保密)。为什么?因为如果私钥泄露了,以前的所有会话不能被解密。TLS 1.3 默认就带了。
1.3 基本架构与分层模型
我们看 TLS 在协议栈里待在哪?
你看,TLS 插在应用层和 TCP 之间。这意味着什么?
- 对上层透明: 应用代码几乎不需要改,就能把明文变成密文。
- 依赖 TCP: TLS 是有状态、有序的协议。改成 UDP 就得用 DTLS。
1.4 TLS 的内部两层结构
很多教程直接讲握手,但我觉得先看分层好理解。
1.4.1 TLS 记录协议
这是底层,所有数据都必须走这里。它干的事很简单:分段、压缩(可选)、加 MAC、加密、加头部。
你想想看,上层应用发一个 100KB 的 HTTP 响应,记录协议会切成 16KB 的片段,每个片段独立加密。为什么要分片?我记得有一次线上出问题,就是因为大包超过了路径 MTU,导致丢包重传——记录协议正好解决了这个问题。
1.4.2 TLS 握手协议
这才是核心。握手发生在连接建立时,负责协商密码套件、交换密钥、互相认证。
握手有几个子协议:
- Handshake: 协商参数、发证书、交换密钥
- ChangeCipherSpec: 告知对方“我要切密钥了”
- Alert: 错误或关闭通知
- Application Data: 加密后的正式数据
我曾经踩过的坑: TLS 1.2 握手需要 2-RTT,也就是客户端发 ClientHello,等服务器回 ServerHello+证书,再发密钥交换。用户靠近服务器还好,跨国访问能差出几百毫秒。后来 TLS 1.3 改成 1-RTT,还支持 0-RTT,体验直接起飞。
1.5 密码套件:TLS 的心脏
TLS 握手的核心结果,就是协商出一套密码套件。长这样:
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
拆开来就是:
| 组件 | 示例 | 作用 |
|---|---|---|
| 密钥交换算法 | ECDHE | 协商会话密钥,必须支持 PFS |
| 认证算法 | RSA(或 ECDSA) | 验证服务器身份 |
| 对称加密 + 模式 | AES_256_GCM | 加密数据,AEAD 模式自带完整性 |
| HMAC 算法 | SHA384 | 消息认证,AEAD 下其实由 GCM 内置 |
我的个人建议: 线上优先用 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256(性能和安全均衡)。别再用 CBC 模式套件了,Padding Oracle 攻击不是闹着玩的。TLS 1.3 就干脆把 AEAD 以外全部砍掉了。
1.6 为什么你该关心 TLS 1.3?
说白了,TLS 1.2 太啰嗦了。TLS 1.3 只做了三件事,效果惊人:
- 握手速度提升: 1-RTT,复用连接 0-RTT
- 移除了不安全算法: RSA 密钥交换、CBC、RC4、3DES、SHA-1 全砍了
- 简化了密码套件: 只保留 5 个 AEAD 套件,配置起来省心
嗯,TLS 1.3 的 0-RTT 有个坑——容易遭受重放攻击。所以我建议:幂等操作(如 GET 请求)用 0-RTT,写操作(如 POST)别用。
1.7 本章小结
到现在,你应该能说清楚三件事:
- TLS 从 SSL 2.0 一路走到 1.3,每次升级都在砍不安全的东西。
- TLS 分两层:握手协议管协商,记录协议管加密传输。
- 密码套件决定安全性,选错套件等于没穿衣服。
下一段路,我们就开始实战:怎么评估当前的密码套件配置,怎么升级。准备好了吗?