Skip to content

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握手之后进行