SSL/TLS协议详解(下)——TLS握手协议
字数 3646 2025-08-29 08:32:25

TLS握手协议详解

1. TLS概述

TLS(Transport Layer Security)协议是互联网上广泛使用的安全通信协议,建立在TCP协议之上,用于保障网络通信的安全。TLS协议的核心特点包括:

  • 使用对称密钥加密通信内容
  • 通过安全密钥交换算法共享对称密钥
  • 使用数字签名进行身份验证
  • 依赖证书颁发机构和信任链验证身份

2. TLS握手流程概述

完整的TLS握手过程包含以下主要步骤:

  1. 客户端发送Client Hello报文
  2. 服务器响应Server Hello报文
  3. 服务器共享证书和进行密钥交换
  4. 客户端和服务器交换密钥信息
  5. 双方更改密码规范
  6. 完成加密握手
  7. 开始加密应用数据传输

3. 详细握手过程解析

3.1 客户端Hello报文

客户端发起握手时首先发送Client Hello报文,包含以下关键信息:

记录协议格式

  • 内容类型(1字节):Handshake(22)
  • 协议版本(2字节):如0x0301表示TLS 1.0
  • 数据长度(2字节):big-endian格式

Client Hello内容

  • 客户端版本:按优先级列出支持的协议版本
  • 客户端随机数:32字节数据(4字节时间戳+28字节随机数)
  • 会话ID:用于会话恢复,首次连接为空
  • 密码套件列表:客户端支持的加密算法组合
  • 压缩方法:支持的压缩算法(现代TLS已禁用)
  • 扩展字段:如服务器名称指示(SNI)等

密码套件格式示例
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256分解:

  • TLS:协议类型
  • ECDHE:密钥交换算法(Elliptic Curve Diffie-Hellman Ephemeral)
  • ECDSA:签名算法
  • AES_128_GCM:对称加密算法(AES-128 in GCM模式)
  • SHA256:MAC算法

3.2 服务器Hello报文

服务器收到Client Hello后响应Server Hello报文:

Server Hello内容

  • 服务器版本:选择双方都支持的最高TLS版本
  • 服务器随机数:32字节(4字节时间戳+28字节随机数)
  • 会话ID:服务器生成的会话标识符
  • 选定密码套件:从客户端列表中选择一个
  • 压缩方法:选定的压缩方法(通常为null)

3.3 证书交换

服务器发送证书消息(Certificate message):

证书链

  • 按顺序发送完整证书链:服务器证书→中间CA证书→...→根CA证书
  • 通常不包含根CA证书,因为客户端已内置

证书内容解析

  • 版本:X.509版本(通常为v3)
  • 序列号:CA分配的唯一正整数
  • 签名算法:如SHA256withRSA
  • 颁发者:证书颁发机构信息
  • 有效期:Not Before和Not After时间
  • 主体公钥信息:包含公钥和生成算法
  • 扩展字段:如密钥用法、主题备用名称等

证书验证

  • 浏览器内置根CA证书
  • 验证证书链信任关系
  • 检查有效期
  • 验证域名匹配(CN或SAN)
  • 检查吊销状态(CRL/OCSP)

3.4 密钥交换

根据选定的密钥交换算法不同,过程有所差异:

3.4.1 ECDHE密钥交换

  1. 服务器生成临时ECDH密钥对
  2. 通过Server Key Exchange消息发送公钥
  3. 客户端生成临时ECDH密钥对
  4. 通过Client Key Exchange消息发送公钥
  5. 双方计算得到相同的预主密钥(Pre-Master Secret)

特点:

  • 提供前向安全性(Forward Secrecy)
  • 每次会话使用新密钥对
  • 计算完成后立即丢弃私钥

3.4.2 RSA密钥交换

  1. 客户端生成48字节预主密钥(2字节协议版本+46字节随机数)
  2. 使用服务器证书中的公钥加密预主密钥
  3. 通过Client Key Exchange消息发送加密后的预主密钥
  4. 服务器用私钥解密获得预主密钥

3.5 主密钥计算

双方使用相同方法从预主密钥计算主密钥(Master Secret):

master_secret = PRF(pre_master_secret, "master secret", 
                   ClientHello.random + ServerHello.random)[0..47]

其中:

  • PRF:伪随机函数(Pseudo-Random Function)
  • "master secret":固定ASCII字符串
  • ClientHello.random和ServerHello.random:握手初始交换的随机数

3.6 密钥派生

从主密钥派生出实际使用的加密密钥:

key_block = PRF(master_secret, "key expansion",
               server_random + client_random)

派生出的密钥包括:

  1. 客户端写入加密密钥
  2. 服务器写入加密密钥
  3. 客户端写入MAC密钥
  4. 服务器写入MAC密钥
  5. 客户端写入IV(初始化向量)
  6. 服务器写入IV

3.7 完成验证

双方交换Finished消息验证握手成功:

  1. 计算verify_data:

    verify_data = PRF(master_secret, finished_label, 
                     Hash(handshake_messages))[0..verify_data_length-1]
    
    • finished_label:"client finished"或"server finished"
    • handshake_messages:所有握手消息的串联
  2. 使用协商的加密算法和密钥加密verify_data

  3. 发送加密后的Finished消息

  4. 对方解密验证verify_data

3.8 会话恢复机制

TLS提供两种会话恢复方式:

  1. 会话ID恢复

    • 服务器存储会话参数与ID的映射
    • 客户端后续连接时发送相同ID
    • 服务器找到对应参数恢复会话
    • 缺点:服务器需要维护大量会话状态
  2. 会话票证(Session Ticket)

    • 服务器加密会话参数作为ticket发送给客户端
    • 客户端存储ticket并在下次连接时发送
    • 服务器解密ticket恢复会话
    • 优点:服务器无状态,ticket由客户端存储

4. 记录协议

TLS记录协议负责封装所有数据:

记录格式

  • 内容类型(1字节):
    • change_cipher_spec(20)
    • alert(21)
    • handshake(22)
    • application_data(23)
  • 协议版本(2字节):如0x0303表示TLS 1.2
  • 长度(2字节):数据长度(不超过18432字节)
  • 数据:实际载荷

5. 加密通信

握手完成后,应用数据通过以下方式加密传输:

  1. 数据分片
  2. 计算MAC(Message Authentication Code)
  3. 使用对称加密算法加密数据+MAC
  4. 添加记录头
  5. 传输加密后的记录

解密过程相反:

  1. 接收记录
  2. 解密数据
  3. 验证MAC
  4. 处理明文数据

6. 安全特性

TLS提供的安全保证:

  1. 机密性:对称加密保护数据内容
  2. 完整性:MAC防止数据篡改
  3. 身份验证:证书链验证服务器身份
  4. 前向安全性(使用DHE/ECDHE时):临时密钥确保过去会话安全

7. 实际案例分析

以访问github.com为例:

  1. 客户端发送Client Hello,支持TLS 1.2,密码套件包括:
    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

  2. 服务器选择TLS 1.2和上述密码套件响应

  3. 服务器发送证书链:

    • github.com证书
    • DigiCert SHA2 Extended Validation Server CA中间证书
  4. 服务器发送ECDHE公钥(Server Key Exchange)

  5. 客户端响应ECDHE公钥(Client Key Exchange)

  6. 双方计算预主密钥→主密钥→会话密钥

  7. 交换Finished消息验证握手

  8. 开始加密应用数据传输

8. 关键算法说明

8.1 伪随机函数(PRF)

TLS使用的PRF基于HMAC,将秘密值、种子和标签组合生成任意长度的伪随机输出。

8.2 加密模式

AES-GCM

  • 认证加密模式,同时提供机密性和完整性
  • 使用128位块大小
  • 集成MAC功能,无需单独计算MAC
  • 使用初始化向量(IV)确保相同明文产生不同密文

8.3 密钥交换算法比较

算法 前向安全 密钥重用 性能 备注
RSA 依赖证书公钥
DHE 传统DH
ECDHE 推荐使用

9. 现代TLS最佳实践

  1. 优先使用TLS 1.2或更高版本
  2. 选择具有前向安全的密码套件(如ECDHE)
  3. 使用强加密算法(如AES-256-GCM)
  4. 禁用不安全的协议版本(SSLv3, TLS 1.0)
  5. 禁用弱密码套件(如RC4, CBC模式)
  6. 正确配置证书链
  7. 启用OCSP Stapling减少延迟
  8. 考虑使用Session Tickets而非Session ID

10. 总结

TLS握手协议通过复杂的密钥交换和身份验证机制,为网络通信建立安全通道。理解TLS握手过程对于网络安全配置、故障排查和性能优化都至关重要。现代TLS实现应注重前向安全性、强加密算法和正确的证书管理,以应对日益复杂的网络安全威胁。

TLS握手协议详解 1. TLS概述 TLS(Transport Layer Security)协议是互联网上广泛使用的安全通信协议,建立在TCP协议之上,用于保障网络通信的安全。TLS协议的核心特点包括: 使用对称密钥加密通信内容 通过安全密钥交换算法共享对称密钥 使用数字签名进行身份验证 依赖证书颁发机构和信任链验证身份 2. TLS握手流程概述 完整的TLS握手过程包含以下主要步骤: 客户端发送Client Hello报文 服务器响应Server Hello报文 服务器共享证书和进行密钥交换 客户端和服务器交换密钥信息 双方更改密码规范 完成加密握手 开始加密应用数据传输 3. 详细握手过程解析 3.1 客户端Hello报文 客户端发起握手时首先发送Client Hello报文,包含以下关键信息: 记录协议格式 : 内容类型(1字节):Handshake(22) 协议版本(2字节):如0x0301表示TLS 1.0 数据长度(2字节):big-endian格式 Client Hello内容 : 客户端版本 :按优先级列出支持的协议版本 客户端随机数 :32字节数据(4字节时间戳+28字节随机数) 会话ID :用于会话恢复,首次连接为空 密码套件列表 :客户端支持的加密算法组合 压缩方法 :支持的压缩算法(现代TLS已禁用) 扩展字段 :如服务器名称指示(SNI)等 密码套件格式示例 : TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 分解: TLS:协议类型 ECDHE:密钥交换算法(Elliptic Curve Diffie-Hellman Ephemeral) ECDSA:签名算法 AES_ 128_ GCM:对称加密算法(AES-128 in GCM模式) SHA256:MAC算法 3.2 服务器Hello报文 服务器收到Client Hello后响应Server Hello报文: Server Hello内容 : 服务器版本 :选择双方都支持的最高TLS版本 服务器随机数 :32字节(4字节时间戳+28字节随机数) 会话ID :服务器生成的会话标识符 选定密码套件 :从客户端列表中选择一个 压缩方法 :选定的压缩方法(通常为null) 3.3 证书交换 服务器发送证书消息(Certificate message): 证书链 : 按顺序发送完整证书链:服务器证书→中间CA证书→...→根CA证书 通常不包含根CA证书,因为客户端已内置 证书内容解析 : 版本:X.509版本(通常为v3) 序列号:CA分配的唯一正整数 签名算法:如SHA256withRSA 颁发者:证书颁发机构信息 有效期:Not Before和Not After时间 主体公钥信息:包含公钥和生成算法 扩展字段:如密钥用法、主题备用名称等 证书验证 : 浏览器内置根CA证书 验证证书链信任关系 检查有效期 验证域名匹配(CN或SAN) 检查吊销状态(CRL/OCSP) 3.4 密钥交换 根据选定的密钥交换算法不同,过程有所差异: 3.4.1 ECDHE密钥交换 服务器生成临时ECDH密钥对 通过Server Key Exchange消息发送公钥 客户端生成临时ECDH密钥对 通过Client Key Exchange消息发送公钥 双方计算得到相同的预主密钥(Pre-Master Secret) 特点: 提供前向安全性(Forward Secrecy) 每次会话使用新密钥对 计算完成后立即丢弃私钥 3.4.2 RSA密钥交换 客户端生成48字节预主密钥(2字节协议版本+46字节随机数) 使用服务器证书中的公钥加密预主密钥 通过Client Key Exchange消息发送加密后的预主密钥 服务器用私钥解密获得预主密钥 3.5 主密钥计算 双方使用相同方法从预主密钥计算主密钥(Master Secret): 其中: PRF:伪随机函数(Pseudo-Random Function) "master secret":固定ASCII字符串 ClientHello.random和ServerHello.random:握手初始交换的随机数 3.6 密钥派生 从主密钥派生出实际使用的加密密钥: 派生出的密钥包括: 客户端写入加密密钥 服务器写入加密密钥 客户端写入MAC密钥 服务器写入MAC密钥 客户端写入IV(初始化向量) 服务器写入IV 3.7 完成验证 双方交换Finished消息验证握手成功: 计算verify_ data: finished_ label:"client finished"或"server finished" handshake_ messages:所有握手消息的串联 使用协商的加密算法和密钥加密verify_ data 发送加密后的Finished消息 对方解密验证verify_ data 3.8 会话恢复机制 TLS提供两种会话恢复方式: 会话ID恢复 : 服务器存储会话参数与ID的映射 客户端后续连接时发送相同ID 服务器找到对应参数恢复会话 缺点:服务器需要维护大量会话状态 会话票证(Session Ticket) : 服务器加密会话参数作为ticket发送给客户端 客户端存储ticket并在下次连接时发送 服务器解密ticket恢复会话 优点:服务器无状态,ticket由客户端存储 4. 记录协议 TLS记录协议负责封装所有数据: 记录格式 : 内容类型(1字节): change_ cipher_ spec(20) alert(21) handshake(22) application_ data(23) 协议版本(2字节):如0x0303表示TLS 1.2 长度(2字节):数据长度(不超过18432字节) 数据:实际载荷 5. 加密通信 握手完成后,应用数据通过以下方式加密传输: 数据分片 计算MAC(Message Authentication Code) 使用对称加密算法加密数据+MAC 添加记录头 传输加密后的记录 解密过程相反: 接收记录 解密数据 验证MAC 处理明文数据 6. 安全特性 TLS提供的安全保证: 机密性 :对称加密保护数据内容 完整性 :MAC防止数据篡改 身份验证 :证书链验证服务器身份 前向安全性 (使用DHE/ECDHE时):临时密钥确保过去会话安全 7. 实际案例分析 以访问github.com为例: 客户端发送Client Hello,支持TLS 1.2,密码套件包括: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 服务器选择TLS 1.2和上述密码套件响应 服务器发送证书链: github.com证书 DigiCert SHA2 Extended Validation Server CA中间证书 服务器发送ECDHE公钥(Server Key Exchange) 客户端响应ECDHE公钥(Client Key Exchange) 双方计算预主密钥→主密钥→会话密钥 交换Finished消息验证握手 开始加密应用数据传输 8. 关键算法说明 8.1 伪随机函数(PRF) TLS使用的PRF基于HMAC,将秘密值、种子和标签组合生成任意长度的伪随机输出。 8.2 加密模式 AES-GCM : 认证加密模式,同时提供机密性和完整性 使用128位块大小 集成MAC功能,无需单独计算MAC 使用初始化向量(IV)确保相同明文产生不同密文 8.3 密钥交换算法比较 | 算法 | 前向安全 | 密钥重用 | 性能 | 备注 | |------|----------|----------|------|------| | RSA | 无 | 是 | 高 | 依赖证书公钥 | | DHE | 有 | 否 | 中 | 传统DH | | ECDHE | 有 | 否 | 高 | 推荐使用 | 9. 现代TLS最佳实践 优先使用TLS 1.2或更高版本 选择具有前向安全的密码套件(如ECDHE) 使用强加密算法(如AES-256-GCM) 禁用不安全的协议版本(SSLv3, TLS 1.0) 禁用弱密码套件(如RC4, CBC模式) 正确配置证书链 启用OCSP Stapling减少延迟 考虑使用Session Tickets而非Session ID 10. 总结 TLS握手协议通过复杂的密钥交换和身份验证机制,为网络通信建立安全通道。理解TLS握手过程对于网络安全配置、故障排查和性能优化都至关重要。现代TLS实现应注重前向安全性、强加密算法和正确的证书管理,以应对日益复杂的网络安全威胁。