TLS协议概览:从SSL到TLS 1.3的演进之路

说到网络安全,TLS 是现在互联网的基石。你刷网页、发邮件、搞API调用,背后都有它。我刚开始接触这玩意儿的时候,也被一堆缩写搞得头晕——SSL、TLS、HTTPS,到底啥关系?这一章我们就把这些概念捋清楚。说白了,搞懂 TLS 的来龙去脉,你才能理解后面握手延迟的问题出在哪。

这章我会带你过一遍:协议怎么从 SSL 演变成 TLS 1.3,它们之间的血缘关系,TLS 内部到底有哪些子协议,以及一次完整的 HTTPS 握手长什么样。嗯,都是基础,但基础不牢,后面优化无从下手。

核心要点: 本章是整个课程的知识地图。理解了 TLS 的架构和握手流程,后续每一章的延迟分析才有落脚点。
TLS 协议概览 📜 发展历史 SSL 1.0/2.0/3.0 (1995) TLS 1.0 (1999) TLS 1.1 (2006) TLS 1.2 (2008) TLS 1.3 (2018) 📦 协议族 TLS 记录协议 TLS 握手协议 TLS 警报协议 变更密码规范协议 应用数据协议 🤝 握手基础 Client Hello Server Hello + 证书 密钥协商 (KE) Change Cipher Spec Finished / 加密通信 图1-1 TLS协议概览:左侧为版本演进历程,中间为协议族组成,右侧为握手基本流程 后续章节将围绕右侧握手流程中的每个环节进行延迟分析与优化

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。每次迭代都在砍不安全特性、加新算法。

实用建议: 2024 年的当下,SSL 2.0/3.0 和 TLS 1.0/1.1 已经被主流浏览器和操作系统废弃。最低底线是 TLS 1.2,生产环境建议直接上 TLS 1.3。

为什么会这样?因为加密算法在变老,计算能力在涨。十年前觉得安全的 RSA 1024,现在用云服务几个小时就能破解。TLS 1.3 砍掉了不少「历史包袱」,比如静态 RSA 密钥交换、压缩、重协商这些容易出问题的功能。

表1-1 SSL / TLS 版本演进对比
版本 发布年份 核心变化 当前安全状态
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 握手、前向安全、砍掉不安全算法 ✅ 强烈推荐
避坑提醒: 我曾经遇到过一台老设备只支持 TLS 1.0,前端浏览器已经强制 1.2+,结果业务中断了整整两天。如果你维护的是 IoT 或嵌入式系统,一定提前确认协议版本兼容性。

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 其实是一组协议的集合,按层级来分:

  1. TLS 记录协议(Record Protocol) — 底层传输器。负责把上层数据分段、压缩(现已禁用)、加密、加 MAC。所有的 TLS 数据都先经过它。
  2. TLS 握手协议(Handshake Protocol) — 最核心的部分。负责双方身份认证、协商密码套件、生成会话密钥。握手延迟主要就出在这里。
  3. TLS 警报协议(Alert Protocol) — 错误报告器。连接出问题时,发一个 alert 告诉对方「我挂了,原因是 XXX」。
  4. TLS 变更密码规范协议(Change Cipher Spec Protocol) — 切换开关。告诉对方「我要开始用新密钥了」。在 TLS 1.3 中这个协议被简化了。
  5. TLS 应用数据协议(Application Data Protocol) — 真正干活儿的上层协议。HTTP/2、HTTP/3 的数据都封装在这里。

你调试握手延迟时,大部分时间盯的是握手协议。但别忘了,记录协议的配置也会影响性能,比如最大分片长度、加密套件的选择。

关键认知: TLS 不是「一个协议」,而是一个协议栈。记录协议在最底层扛着所有上层协议的数据传输。握手协议只是其中一个「租户」。

1.4 HTTPS握手基础:一次完整的TLS握手

好了,来真格的。一个标准的 TLS 1.2 完整握手长什么样?我用大白话给你捋一遍:

  1. Client Hello: 客户端发个消息过去,告诉服务器「我支持这些 TLS 版本、这些密码套件、这些扩展」。里面还带一个随机数。
  2. Server Hello: 服务器从列表里挑一个版本和一个套件,发回自己的随机数和证书。
  3. 证书验证: 客户端检查服务器证书是否可信(CA 链、有效期、域名匹配)。
  4. 密钥交换: