SSL/TLS 握手 overview
SSL/TLS 握手是客户端和服务器建立加密连接的协商过程。现代浏览器访问 HTTPS 网站时,背后都在进行复杂的握手协商。
握手阶段概览
|
|
详细握手过程(以 RSA 密钥交换为例)
1. ClientHello
客户端向服务器发送:
- TLS 版本支持(如 1.2 或 1.3)
- 随机数 ClientRandom
- 支持的cipher suites(加密套件列表)
- 支持的压缩方法
|
|
2. ServerHello
服务器选择协议版本和加密套件,返回:
- ServerRandom 随机数
- 选定的 cipher suite
- Session ID(用于恢复)
3. Certificate
服务器发送数字证书链:
- 服务器证书(包含公钥)
- 中间证书(可选)
- 根证书(通常不发送,客户端已信任)
证书验证:
- 检查证书链完整性
- 验证证书签名
- 检查证书有效期
- 检查域名匹配
4. ServerKeyExchange(可选)
如果采用的 cipher suite 需要额外的密钥交换参数,服务器发送此消息。
例如:ECDHE 密钥交换中,服务器发送:
- 椭圆曲线参数
- 服务器的公钥值
- 签名(验证服务器身份)
5. ServerHelloDone
服务器表示初始阶段完成。
6. ClientKeyExchange
客户端生成预主密钥(Pre-Master Secret),用服务器公钥加密后发送。
|
|
7. 生成主密钥
双方使用相同的算法生成主密钥:
|
|
其中 PRF 是伪随机函数(Pseudo-Random Function)。
8. ChangeCipherSpec
客户端通知服务器后续通信将使用协商的加密套件。
9. Finished
客户端发送 Finished 消息,使用主密钥计算 handshake hash 的 MAC。
10. ChangeCipherSpec + Finished(服务器)
服务器也发送 ChangeCipherSpec 和 Finished,握手完成。
加密通道建立
握手完成后:
- 对称密钥:双方已计算出相同的会话密钥
- 数据加密:使用协商的对称加密算法(如 AES-GCM)
- 完整性保护:使用 MAC 或 AEAD 模式
OpenSSL 握手诊断
1. 查看握手过程
|
|
2. 查看证书链
|
|
3. 测试支持的加密套件
|
|
TLS 1.3 的改进
TLS 1.3 简化了握手过程:
- 移除 RSA 密钥交换(只支持 ECDHE)
- 移除 renegotiation
- 握手时间:1-RTT(甚至 0-RTT)
安全风险
- BEAST 攻击:TLS 1.0 CBC 模式漏洞
- POODLE 攻击:SSL 3.0 填充漏洞
- Heartbleed:OpenSSL 心跳扩展内存泄漏
- Logjam:弱 DH 参数攻击
防御:
- 禁用 TLS 1.0/1.1
- 使用强 DH 参数(2048 位以上)
- 定期更新 OpenSSL