TLS协议概览:从SSL到TLS 1.3的演进之路
说到网络安全,TLS 是现在互联网的基石。你刷网页、发邮件、搞API调用,背后都有它。我刚开始接触这玩意儿的时候,也被一堆缩写搞得头晕——SSL、TLS、HTTPS,到底啥关系?这一章我们就把这些概念捋清楚。说白了,搞懂 TLS 的来龙去脉,你才能理解后面握手延迟的问题出在哪。
这章我会带你过一遍:协议怎么从 SSL 演变成 TLS 1.3,它们之间的血缘关系,TLS 内部到底有哪些子协议,以及一次完整的 HTTPS 握手长什么样。嗯,都是基础,但基础不牢,后面优化无从下手。
1.1 从SSL到TLS:一段加密协议的进化史
TLS 的前身是 SSL,全称是 Secure Sockets Layer。网景公司在 90 年代中期搞出了 SSL 1.0,但没公开发布。真正面世的是 SSL 2.0(1995),不过漏洞太多。我记得那时候的浏览器一遇到 SSL 连接就弹窗,用户体验极差。
1996 年 SSL 3.0 发布,算是补了窟窿。但好景不长,1999 年 IETF 接手了这个协议,改了个名叫 TLS 1.0。说白了,TLS 1.0 就是 SSL 3.1。我早期做项目时,见过不少老系统还在用 SSL 3.0,那个兼容性真是噩梦。
之后的路子就清晰了:2006 年 TLS 1.1、2008 年 TLS 1.2、2018 年 TLS 1.3。每次迭代都在砍不安全特性、加新算法。
为什么会这样?因为加密算法在变老,计算能力在涨。十年前觉得安全的 RSA 1024,现在用云服务几个小时就能破解。TLS 1.3 砍掉了不少「历史包袱」,比如静态 RSA 密钥交换、压缩、重协商这些容易出问题的功能。
| 版本 | 发布年份 | 核心变化 | 当前安全状态 |
|---|---|---|---|
| SSL 1.0 | 未公开 | 网景内部草案 | 从未发布 |
| SSL 2.0 | 1995 | 首次公开,存在严重安全缺陷 | ❌ 已废弃 |
| SSL 3.0 | 1996 | 修复了 2.0 的漏洞,引入 SHA-1 | ❌ 已废弃 (POODLE 攻击) |
| TLS 1.0 | 1999 | 基于 SSL 3.0,IETF 标准化 | ❌ 已废弃 |
| TLS 1.1 | 2006 | 防 CBC 攻击,支持 CCM 模式 | ❌ 已废弃 |
| TLS 1.2 | 2008 | SHA-256、AEAD、GCM 支持 | ✅ 广泛使用(过渡中) |
| TLS 1.3 | 2018 | 1-RTT 握手、前向安全、砍掉不安全算法 | ✅ 强烈推荐 |
1.2 SSL与TLS:剪不断理还乱的关系
很多人搞不清 SSL 和 TLS 的区别。其实很简单:TLS 就是 SSL 的继任者。
从技术上讲,TLS 1.0 的 RFC 编号是 2246,它直接建立在 SSL 3.0 的基础上。改了啥?改了命名空间、调整了握手细节、加固了密码套件。但整体框架几乎一样。所以有时候你会看到老代码里还叫「SSL_CTX」,但实际用的是 TLS。
我个人习惯在交流中用「TLS」来指代整个协议族。毕竟 SSL 已经是过去式了。但你要知道,很多运维工具和日志里仍然写着「SSL」,比如 OpenSSL 这个库的名字就一直没改。
- 命名关系: SSL 是商标(网景),TLS 是标准(IETF)。
- 技术关系: TLS 1.0 = SSL 3.1,TLS 1.1 = SSL 3.2,以此类推。
- 兼容性: TLS 1.0/1.1 向下兼容 SSL 3.0,但 TLS 1.2/1.3 彻底断了关系。
- 代码层面: OpenSSL 库同时实现了 SSL 和 TLS,配置时用
ssl_protocols指令来控制。
你想想看,一个协议活了 30 年,名字换了但精神还在,也挺不容易的。
1.3 TLS协议族:不只是握手协议
很多人提到 TLS 就想到握手。但握手只是冰山一角。TLS 其实是一组协议的集合,按层级来分:
- TLS 记录协议(Record Protocol) — 底层传输器。负责把上层数据分段、压缩(现已禁用)、加密、加 MAC。所有的 TLS 数据都先经过它。
- TLS 握手协议(Handshake Protocol) — 最核心的部分。负责双方身份认证、协商密码套件、生成会话密钥。握手延迟主要就出在这里。
- TLS 警报协议(Alert Protocol) — 错误报告器。连接出问题时,发一个 alert 告诉对方「我挂了,原因是 XXX」。
- TLS 变更密码规范协议(Change Cipher Spec Protocol) — 切换开关。告诉对方「我要开始用新密钥了」。在 TLS 1.3 中这个协议被简化了。
- TLS 应用数据协议(Application Data Protocol) — 真正干活儿的上层协议。HTTP/2、HTTP/3 的数据都封装在这里。
你调试握手延迟时,大部分时间盯的是握手协议。但别忘了,记录协议的配置也会影响性能,比如最大分片长度、加密套件的选择。
1.4 HTTPS握手基础:一次完整的TLS握手
好了,来真格的。一个标准的 TLS 1.2 完整握手长什么样?我用大白话给你捋一遍:
- Client Hello: 客户端发个消息过去,告诉服务器「我支持这些 TLS 版本、这些密码套件、这些扩展」。里面还带一个随机数。
- Server Hello: 服务器从列表里挑一个版本和一个套件,发回自己的随机数和证书。
- 证书验证: 客户端检查服务器证书是否可信(CA 链、有效期、域名匹配)。
- 密钥交换: