TLS/SSL 协议概述:历史、版本、应用场景

咱们先从最基础的说起。TLS(传输层安全)和它的前身 SSL(安全套接层),说白了就是在 TCP 上面加了一层加密隧道。你发的每一个 HTTP 请求、每一条邮件、每一次 API 调用,只要经过 HTTPS,背后都是 TLS 在干活。我最早接触这玩意儿是在做电商支付接口的时候,那时候还叫 SSL,证书动不动就过期,一过期整个支付流程就卡死……嗯,踩过坑才明白这东西有多重要。

1.1 历史脉络:从 SSL 到 TLS 的演进

故事要从 1994 年讲起。Netscape 公司为了给浏览器加一把锁,推出了 SSL 1.0——但根本没对外发布,因为安全漏洞太多。真正可用的是 1995 年的 SSL 2.0,不过它的问题也很大:不支持证书校验、MAC 太弱,说白了就是个半成品。1996 年的 SSL 3.0 才算走上正轨,引入了握手协议和更强的加密套件。我当年在公司维护的老系统里还见过 SSL 3.0 的配置,吓得我赶紧让它退役了。

1999 年,IETF 在 SSL 3.0 的基础上发布了 TLS 1.0(RFC 2246)。本质上就是 SSL 3.0 的小改版,改了改 HMAC 算法和一些细节,但两个协议不互通。你想想看,后来很多客户端为了兼容,不得不同时支持 SSL 3.0 和 TLS 1.0,握手的第一步就得先协商版本,这本身就增加了复杂度。

2006 年 TLS 1.1 发布,主要修了两个漏洞:一个是对 CBC 模式的 IV 预测攻击,一个是填充预言攻击。2008 年的 TLS 1.2 是个大版本,引入了 AEAD 套件(比如 GCM)、SHA-256、以及扩展主密钥,到现在依然是最广泛使用的版本。

2018 年 TLS 1.3 终于定稿(RFC 8446)。它砍掉了一大堆老旧算法,把握手从 2-RTT 降到 1-RTT(甚至 0-RTT),安全性大幅提升。我最近在帮客户做性能优化时,只要对方支持 1.3,我都会优先启用——减少一次往返,对移动端效果很明显。

个人建议:如果你的服务只面对现代浏览器和客户端(2020 年以后),可以只开启 TLS 1.2 和 1.3,把 1.0、1.1 和所有 SSL 版本全部关掉。安全性和性能都有保障。

1.2 版本对比:每个版本的核心差异

我把各版本的关键差异整理成了表格,方便你对照查阅。

协议版本 发布年份 核心变化 当前状态
SSL 2.0 1995 第一个公开版本,但安全太弱 已废弃
SSL 3.0 1996 引入握手协议、证书链验证 已废弃(POODLE 漏洞)
TLS 1.0 1999 基于 SSL 3.0,升级 HMAC 不建议使用
TLS 1.1 2006 修复 CBC IV 预测攻击 不建议使用
TLS 1.2 2008 AEAD 套件、SHA-256、扩展主密钥 推荐使用
TLS 1.3 2018 简化的握手、1-RTT/0-RTT、移除不安全算法 强烈推荐

这里有个关键点:SSL 3.0 的 POODLE 漏洞(2014 年爆出来)让整个业界加速了向 TLS 的迁移。我曾经在生产环境里排查过一个间歇性连接失败的问题,最后发现是某个老旧负载均衡器还在用 SSL 3.0 协商,客户端又禁用了它,导致握手失败。从那以后我要求所有设备必须至少支持 TLS 1.2。

1.3 应用场景:TLS 在哪些地方落地

别以为 TLS 只用在浏览器地址栏那把锁上。它的应用场景比你想的广得多:

  • Web 安全(HTTPS)——最典型的场景,所有敏感数据传输必须走 TLS。
  • 邮件协议(SMTP/POP3/IMAP over TLS)——收发信件时,客户端和服务端之间用 STARTTLS 或直接 TLS 加密。
  • VPN 和远程访问——很多 VPN 实现基于 TLS(如 OpenVPN 的 TCP 模式),甚至 SSH 隧道也能复用 TLS 端口。
  • API 网关和微服务——内部服务之间的通信,mTLS(双向 TLS)已经成为零信任架构的标配。
  • 物联网(IoT)——轻量级 TLS(如 TLS 1.3 的 0-RTT)让资源受限设备也能安全通信。

举个例子,我之前帮一家金融公司做内部服务治理,要求所有服务间调用必须使用 mTLS。每个服务都要出示客户端证书,服务端验证后再颁发自己的证书。过程是繁琐了点,但安全等级确实上了一个台阶。不过要注意,0-RTT 虽然快,但有重放攻击的风险——尤其是非幂等的请求,你在设计接口时必须考虑这一点。

踩坑提醒:我曾经遇到过 TLS 1.3 的 0-RTT 在支付接口上导致的重复扣款问题。因为早期数据包被攻击者重新发送,服务端没有做去重。如果你使用 0-RTT,切记只对幂等操作启用,或者加上额外的 nonce 校验。

1.4 核心逻辑:一次完整的 TLS 握手

咱们用一张图来概括 TLS 协议在 OSI 模型中的位置,以及握手的核心流程。这样你心里就有个整体轮廓了。

TLS 协议栈与握手流程 应用层(HTTP/FTP) TLS 握手 / 记录协议 传输层(TCP) 客户端 服务端 ClientHello ServerHello Certificate ClientKeyExchange ChangeCipherSpec ChangeCipherSpec Finished Finished 加密数据传输(应用数据) 说明:左侧为协议栈位置,右侧为典型的 2-RTT TLS 1.2 完整握手流程。 TLS 1.3 将握手精简为 1-RTT,且移除了静态 RSA 密钥交换。

从图中你能看到:客户端先发 ClientHello(包含支持的版本、密码套件),服务端回复 ServerHello 并带上证书,然后双方交换密钥参数,最后发送 ChangeCipherSpec 和 Finished 确认。这一步一步走完,才开始真正的加密通信。TLS 1.3 把交互次数从 4 步减到了 2 步(不含 TCP 开头的 SYN/SYN-ACK),这就是它快的原因。

记住这个数字:每次 TLS 完整握手至少增加 2 个 RTT 的延迟(TLS 1.2),加上 TCP 的 1 个 RTT,总计 3 个 RTT 才能开始发数据。所以会话复用技术(Session Ticket 或 Session ID)才会那么重要——我们后面会专门讲它。