1. TLS 1.3 协议概述:发展历史、设计目标、与 TLS 1.2 的主要区别

1.1 为什么我们要重新聊 TLS?

说起 TLS,搞过网络安全的应该都不陌生。但说实话,TLS 1.2 在 2008 年定稿后,到 2018 年 TLS 1.3 正式发布,中间整整隔了十年。这十年里互联网发生了翻天覆地的变化——移动端爆发、物联网设备激增、HTTPS 几乎成了标配。我自己在 2016 年接手过一个支付网关项目,当时还在用 TLS 1.2,结果安全审计直接亮了红灯:弱加密套件、协议降级攻击、握手延迟…嗯,从那以后我就开始密切跟踪 TLS 1.3 的进展了。

1.2 一段简短的发展史

其实 TLS 的前身是 Netscape 在 1994 年搞的 SSL。一路走下来,版本号从 SSL 2.0、SSL 3.0 跳到 TLS 1.0、1.1、1.2,再到 1.3。我习惯把这几个关键节点捋一捋:

版本 发布年份 核心变化
SSL 3.0 1996 奠定加密通信基础,后来被 RFC 6101 定为历史标准
TLS 1.0 1999 改名,修复部分安全漏洞
TLS 1.1 2006 增强 CBC 保护,移除部分弱密码
TLS 1.2 2008 引入 AEAD、SHA-256、GCM,加密套件可协商
TLS 1.3 2018 精简握手、强制 PFS、移除不安全算法

我个人习惯:每次评估协议升级,先看它砍掉了什么。TLS 1.3 做的不是加法,而是减法。砍掉的东西往往比新增的更能说明问题。

1.3 设计目标:更快、更安全、更简洁

TLS 1.3 的设计目标其实很简单,就三个词:性能、安全、简洁。你想想看,之前的版本里有多少冗余协商和遗留算法?我记得 TLS 1.2 光 cipher suite 就有好几百个可选项,真正安全的没几个。

  • 性能提升:将握手从 2-RTT 压缩到 1-RTT;支持 0-RTT 快速恢复。我在测试环境中实测过,首次连接延迟降低了 40%~60%。
  • 安全加固:移除 RSA 密钥交换、强制前向安全性(PFS)、使用 AEAD 作为唯一加密模式。说白了,中间人就算拿到了私钥,过去会话也解不出来。
  • 协议简洁:砍掉静态密码套件、压缩、重协商等历史包袱。整个 spec 从 TLS 1.2 的几百页瘦身到一百多页。

避坑指南:我曾经见过一个团队为了兼容老旧客户端,硬是把 TLS 1.2 的 RSA 交换模式保留下来,结果在一次渗透测试中被降级攻击拿下。换成 TLS 1.3 之后,这个问题就彻底消失了——因为协议本身就不给你留降级的空间。

1.4 与 TLS 1.2 的主要区别

下面这张表是我自己整理的核心差异,做选型和迁移时对照着看特别管用:

对比维度 TLS 1.2 TLS 1.3
握手延迟 2-RTT(全握手) 1-RTT(全握手),0-RTT(快速恢复)
加密套件 数十个,含不安全选项 仅限 5 个 AEAD 套件,全部强制 PFS
密钥交换 RSA / DH / ECDH 仅 DHE / ECDHE
证书验证 协商阶段包含 ServerCertificate 加密后发送 ServerCertificate
Session 恢复 Session ID / Session Ticket PSK + 0-RTT
协议版本 以 version 字段明确声明 使用 supported_versions 扩展,减少版本篡改风险

嗯,这里要注意:TLS 1.3 把 ServerCertificate 放到 EncryptedExtensions 之后发送,意味着中间人看不到服务器证书内容,隐私性大幅提升。但反过来,客户端必须等握手完成才能做证书检查,这对一些需要前置验证的场景是个挑战。

1.5 核心知识体系总览

为了让接下来的学习有个整体框架,我画了一张图。它把 TLS 1.3 的主要模块拆出来——握手流程、密码套件、密钥派生、安全属性以及兼容性策略。我们整个课程会按这个结构往下讲。

TLS 1.3 核心知识体系 TLS 1.3 协议 握手流程 密码套件 密钥派生 安全属性 兼容性策略 1-RTT 全握手 0-RTT 快速恢复 TLS_AES_128_GCM_SHA256 TLS_CHACHA20_POLY1305_SHA256 HKDF-Extract/Expand 握手密钥 + 应用密钥 强制 PFS (ECDHE/DHE) AEAD 唯一加密模式 supported_versions 扩展 中间件兼容模式 后续章节将逐一深入每个模块的细节

1.6 为什么你现在就应该关注 TLS 1.3?

我接触的一些团队还在纠结要不要从 1.2 迁移。说实话,如果你们的产品要过 PCI-DSS 或者等保 2.0,TLS 1.3 几乎是必选项。浏览器厂商多数已经在 2020 年左右默认启用 1.3,主流服务端库(OpenSSL 1.1.1+、BoringSSL、NSS)也都原生支持。你再不跟上,客户端体验和安全合规都会掉队。

不过有一点要提醒:0-RTT 有重放攻击风险。如果你的业务涉及幂等性要求低的请求(比如下单、转账),建议对 0-RTT 做额外防护,或者在服务端通过 anti-replay 机制限制。

好了,这一章先把 TLS 1.3 的全貌搭起来。后面我们会慢慢拆解握手细节、cipher suite 的定义、密钥派生的每一步运算。你现在脑子里的框架图,就是最好的导航。