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 协议栈分层架构 应用层(HTTP / FTP / SMTP) TLS 握手协议 TLS 记录协议 密码套件 / 证书管理 告警 / ChangeCipherSpec 传输层(TCP 443) 网络层 / 物理层(IP + 硬件) 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 本章小结

到现在,你应该能说清楚三件事:

  1. TLS 从 SSL 2.0 一路走到 1.3,每次升级都在砍不安全的东西。
  2. TLS 分两层:握手协议管协商,记录协议管加密传输。
  3. 密码套件决定安全性,选错套件等于没穿衣服。

下一段路,我们就开始实战:怎么评估当前的密码套件配置,怎么升级。准备好了吗?