SSL/TLS 握手 overview

SSL/TLS 握手是客户端和服务器建立加密连接的协商过程。现代浏览器访问 HTTPS 网站时,背后都在进行复杂的握手协商。

握手阶段概览

1
2
3
4
5
6
7
8
1. ClientHello →  客户端发起连接
2. ← ServerHello  服务器响应
3. ← Certificate  服务器发送证书
4. ← KeyExchange  密钥交换参数
5. ClientKeyExchange → 客户端发送密钥材料
6. ChangeCipherSpec →  切换加密
7. Finished →      验证握手完整
8. ← Finished     服务器确认

详细握手过程(以 RSA 密钥交换为例)

1. ClientHello

客户端向服务器发送:

  • TLS 版本支持(如 1.2 或 1.3)
  • 随机数 ClientRandom
  • 支持的cipher suites(加密套件列表)
  • 支持的压缩方法
1
2
3
4
ClientHello:
  Version: TLS 1.2
  Random: [48 字节随机数]
  Cipher Suites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, ...

2. ServerHello

服务器选择协议版本和加密套件,返回:

  • ServerRandom 随机数
  • 选定的 cipher suite
  • Session ID(用于恢复)

3. Certificate

服务器发送数字证书链:

  • 服务器证书(包含公钥)
  • 中间证书(可选)
  • 根证书(通常不发送,客户端已信任)

证书验证:

  1. 检查证书链完整性
  2. 验证证书签名
  3. 检查证书有效期
  4. 检查域名匹配

4. ServerKeyExchange(可选)

如果采用的 cipher suite 需要额外的密钥交换参数,服务器发送此消息。

例如:ECDHE 密钥交换中,服务器发送:

  • 椭圆曲线参数
  • 服务器的公钥值
  • 签名(验证服务器身份)

5. ServerHelloDone

服务器表示初始阶段完成。

6. ClientKeyExchange

客户端生成预主密钥(Pre-Master Secret),用服务器公钥加密后发送。

1
2
Pre-Master Secret = [48 字节随机数]
 encrypted with Server's Public Key

7. 生成主密钥

双方使用相同的算法生成主密钥:

1
Master Secret = PRF Pre-Master Secret, Label, ClientRandom + ServerRandom]

其中 PRF 是伪随机函数(Pseudo-Random Function)。

8. ChangeCipherSpec

客户端通知服务器后续通信将使用协商的加密套件。

9. Finished

客户端发送 Finished 消息,使用主密钥计算 handshake hash 的 MAC。

10. ChangeCipherSpec + Finished(服务器)

服务器也发送 ChangeCipherSpec 和 Finished,握手完成。

加密通道建立

握手完成后:

  1. 对称密钥:双方已计算出相同的会话密钥
  2. 数据加密:使用协商的对称加密算法(如 AES-GCM)
  3. 完整性保护:使用 MAC 或 AEAD 模式

OpenSSL 握手诊断

1. 查看握手过程

1
2
3
4
5
# 使用 s_client 查看完整握手
openssl s_client -connect example.com:443 -tls1_2

# 仅显示握手消息
openssl s_client -connect example.com:443 -tls1_2 -msg

2. 查看证书链

1
2
3
4
5
# 显示服务器证书
openssl s_client -connect example.com:443 -showcerts

# 验证证书
openssl s_client -connect example.com:443 -verify_return_error

3. 测试支持的加密套件

1
2
3
4
5
# 列出支持的 cipher suites
nmap --script ssl-enum-ciphers -p 443 example.com

# 使用 OpenSSL 测试
openssl ciphers -v 'HIGH:MEDIUM:!aNULL:!MD5'

TLS 1.3 的改进

TLS 1.3 简化了握手过程:

  • 移除 RSA 密钥交换(只支持 ECDHE)
  • 移除 renegotiation
  • 握手时间:1-RTT(甚至 0-RTT)

安全风险

  1. BEAST 攻击:TLS 1.0 CBC 模式漏洞
  2. POODLE 攻击:SSL 3.0 填充漏洞
  3. Heartbleed:OpenSSL 心跳扩展内存泄漏
  4. Logjam:弱 DH 参数攻击

防御:

  • 禁用 TLS 1.0/1.1
  • 使用强 DH 参数(2048 位以上)
  • 定期更新 OpenSSL

参考来源