TLS握手过程
TLS(运输层安全协议)在TCP连接建立后、HTTP数据传输前进行握手,完成服务器鉴别和会话密钥协商。
完整握手流程(TLS 1.2)
客户A(浏览器) 服务器B
│ │
│─── ① ClientHello ──────────────────────→│
│ [TLS版本号、支持的加密套件列表、客户不重数Ra]
│ │
│←── ② ServerHello ────────────────────── │
│ [选定的加密套件、服务器不重数Rb] │
│ │
│←── ③ Certificate ───────────────────────│
│ [服务器B的CA数字证书] │
│ │
│ (A用CA公钥验证证书:确认这是真正的B) │
│ │
│─── ④ ClientKeyExchange ────────────────→│
│ [用B的公钥PKB加密的预主密钥PMS] │
│ │
│ B用私钥SKB解出PMS │
│ 双方用 PMS + Ra + Rb → 主密钥MS │
│ 主密钥MS → 4个会话密钥 │
│ │
│─── ⑤ ChangeCipherSpec ────────────────→ │
│ (通知:后续使用协商的加密) │
│ │
│─── ⑥ Finished(握手完成 MAC)───────────→│
│←── ⑦ ChangeCipherSpec + Finished ────── │
│ │
├──────────── 加密的HTTP数据传输 ──────────┤
四个会话密钥(主密钥MS → 分割)
| 密钥 | 用途 |
|---|---|
| \(K_A^{enc}\) | A→B 数据加密密钥 |
| \(K_A^{MAC}\) | A→B 数据完整性密钥(MAC) |
| \(K_B^{enc}\) | B→A 数据加密密钥 |
| \(K_B^{MAC}\) | B→A 数据完整性密钥(MAC) |
使用不同密钥防止反射攻击。
TLS 1.3的改进
- 使用椭圆曲线密码(ECC)代替RSA密钥交换
- 握手减少到 1-RTT(TLS 1.2需要2-RTT)
- 0-RTT:重连时使用存储的会话密钥,无需握手延迟
- 禁止弱算法(无RC4、MD5、SHA-1、3DES等)
记录协议(会话阶段)
将应用数据分割为记录(Record),对每条记录: 1. 分配序号(嵌入MAC计算,不写入记录本身) 2. 计算MAC:\(MAC = H(K_A^{MAC} + ext{序号} + ext{明文记录})\) 3. 加密:用 \(K_A^{enc}\) 加密(明文+MAC) 4. 发送:类型(1B) + 版本(2B) + 长度(2B) + 加密内容
防截断攻击
关闭连接前,双方必须发送"TLS关闭记录";如果A/B看到TCP FIN但没有TLS关闭记录,则知道这是截断攻击。
参见
- [[07-网络安全]] — TLS完整介绍
- [[07-网络安全|数字证书]] — 服务器证书验证
- [[TCP三次握手]] — TLS握手在TCP握手之后进行