引言
上一篇我们讲了 HTTPS 的加密原理——对称加密、非对称加密、混合加密和证书体系。但只知道"用什么加密"还不够,还需要知道加密是怎么建立起来的。
浏览器和服务器在传输任何数据之前,要先完成一个"打招呼"的过程,协商好加密方式、验证彼此身份、生成对称密钥。这个过程就是TLS 握手。
TLS 是 HTTPS 的核心。本文将通过大量图解,详细拆解 TLS 1.2 的握手过程,并对比 TLS 1.3 的优化。
第一部分:TLS 握手概述
一、握手的目的
TLS 握手要完成三件事:
| 目的 | 说明 |
|---|---|
| 协商加密方式 | 双方确定用什么算法(对称/非对称/哈希) |
| 验证身份 | 服务器(可选客户端)证明"我是谁" |
| 生成密钥 | 双方生成只有彼此知道的对称密钥 |
二、TLS 握手完整流程(TLS 1.2)
三、四个阶段详解
第①步:Client Hello
客户端 → 服务器
内容:
- 支持的 TLS 版本(TLS 1.2、TLS 1.3)
- 支持的加密套件列表(如 TLS_RSA_WITH_AES_128_GCM_SHA256)
- 随机数1(Client Random,32字节)
- 会话 ID(如果之前连接过,可以复用)
加密套件的命名规则:
第②步:Server Hello
服务器 → 客户端
内容:
- 选定的 TLS 版本
- 选定的加密套件
- 随机数2(Server Random,32字节)
- 数字证书(包含服务器公钥)
第③步:密钥交换(核心步骤)
这里又分为两种方式:RSA 密钥交换和DH 密钥交换。
RSA 方式(传统):
DH 密钥交换(ECDHE,现代主流):
第④步:Finished
双方用生成的对称密钥加密一条"Finished"消息发给对方。如果对方能正确解密,说明握手成功。
第二部分:RSA vs DH 密钥交换
| 对比项 | RSA 密钥交换 | ECDHE 密钥交换 |
|---|---|---|
| 密钥来源 | 浏览器生成,用服务器公钥加密传过去 | 双方各生成临时密钥对,交换公钥算出 |
| 前向安全性 | ❌ 没有(服务器私钥泄露=历史全部可解密) | ✅ 有(每次临时密钥用完即丢) |
| 性能 | 快 | 稍慢(需要多次椭圆曲线运算) |
| 当前状态 | 已被 TLS 1.3 移除 | TLS 1.3 唯一方式 |
前向安全性详解
第三部分:TLS 1.3 的改进
TLS 1.3(2018年发布)做了大幅简化:
TLS 1.3 的核心改进:
| 改进 | 说明 |
|---|---|
| 握手更快 | 从 2-RTT 降到 1-RTT |
| 只保留前向安全的算法 | 移除 RSA 密钥交换、移除 CBC 模式 |
| 0-RTT 恢复 | 之前连接过的客户端可以 0-RTT 发数据 |
| 加密更多握手信息 | 证书等敏感信息也在握手过程中加密 |
第四部分:wireshark 抓包示意
# 抓取 TLS 握手包 # 在终端执行: curl -v https://www.example.com用 Wireshark 过滤ssl或tls,可以看到:
Client Hello → Version: TLS 1.2 → Cipher Suites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, ... Server Hello → Version: TLS 1.2 → Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 → Certificate (服务器证书) Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message Change Cipher Spec, Encrypted Handshake Message Application Data (加密的数据开始传输)第五部分:面试题
1. Q:TLS 握手需要几次 RTT?
A:TLS 1.2 需要 2-RTT,TLS 1.3 只需 1-RTT。
2. Q:什么是前向安全性?哪些算法有?
A:即使服务器长期私钥泄露,历史通信也无法被解密。ECDHE 有前向安全性,RSA 没有。
3. Q:为什么 TLS 1.3 移除了 RSA 密钥交换?
A:RSA 不支持前向安全性。TLS 1.3 只保留 ECDHE 这种有前向安全性的密钥交换方式。
4. Q:加密套件TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256各部分的含义?
A:协议=TLS,密钥交换=ECDHE,身份验证=RSA,对称加密=AES-128-GCM,哈希=SHA256。
5. Q:TLS 握手中三个随机数的作用?
A:客户端随机数 + 服务器随机数 + Pre-Master Secret → 共同计算出对称密钥。每个随机数都是 32 字节,确保即使某一方随机数生成器较弱,最终密钥仍然安全。
总结
一、TLS 握手核心流程
TLS 1.2 握手 = 4 步、2-RTT ① Client Hello(支持的加密方式 + 随机数1) ② Server Hello(选定加密方式 + 随机数2 + 证书) ③ 密钥交换(RSA 或 ECDHE) ④ Finished(验证握手成功) TLS 1.3 握手 = 2 步、1-RTT 移除了 RSA,只保留 ECDHE,更快更安全二、一句话记忆
TLS 握手通过 Client Hello 和 Server Hello 协商加密方式、交换随机数、验证证书,然后用 ECDHE(现代)或 RSA(旧)安全交换对称密钥。TLS 1.2 需要 2-RTT,TLS 1.3 降到 1-RTT 并强制要求前向安全性。