外观
TLS 握手流程
⭐ 题目日期:
腾讯 - 2024/08/19
📝 题解:
TLS(Transport Layer Security)握手是建立安全通信通道的核心过程,确保数据加密和身份验证。以下是 TLS 1.2 和 TLS 1.3 的握手流程对比及详细解析:
一、TLS1.2 握手流程(经典四次交互)
1. Client Hello
- 客户端发起:
- 发送支持的 TLS 版本、客户端随机数(Client Random)、密码套件列表(Cipher Suites)、压缩方法等。
- 可选扩展(如 SNI:Server Name Indication,指定访问的域名)。
2. Server Hello
- 服务端响应:
- 选择 TLS 版本、服务端随机数(Server Random)、确定的密码套件(如
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
)。 - 返回证书链(Certificate)用于身份验证。
- 选择 TLS 版本、服务端随机数(Server Random)、确定的密码套件(如
3. 密钥交换与验证
- 服务端发送:
- Certificate:服务端证书链(包含公钥)。
- Server Key Exchange:密钥交换参数(如 ECDHE 公钥)。
- Certificate Request(可选):要求客户端提供证书(双向认证)。
- Server Hello Done:通知客户端信息发送完毕。
- 客户端验证:
- 校验服务端证书链是否可信(检查签名、有效期、吊销状态等)。
- 生成预主密钥(Pre-Master Secret),使用服务端公钥加密后发送(Client Key Exchange)。
- 若需双向认证,发送客户端证书和签名(Certificate Verify)。
4. 会话密钥生成
- 主密钥计算: 客户端和服务端通过以下参数计算主密钥(Master Secret):
Master Secret = PRF(Pre-Master Secret, "master secret", ClientRandom + ServerRandom)
- 会话密钥派生: 通过主密钥生成会话密钥(加密密钥、MAC 密钥、初始向量等)。
5. 切换加密与完成握手
- Change Cipher Spec: 双方通知后续通信使用协商的加密参数。
- Finished: 发送加密的 Finished 消息,验证握手过程完整性。
二、TLS 1.3 握手流程(简化与性能优化)
1. Client Hello
- 客户端发起:
- 支持 TLS 1.3,发送客户端随机数、密码套件列表、密钥共享参数(如 ECDHE 公钥)。
- 扩展优化(如 Pre-Shared Key, PSK 用于 0-RTT)。
2. Server Hello
- 服务端响应:
- 选择 TLS 1.3,发送服务端随机数、密钥共享参数(ECDHE 公钥)。
- Certificate:证书链(支持 OCSP Stapling 减少延迟)。
- Certificate Verify:服务端签名验证身份。
- Finished:直接完成握手。
3. 密钥生成
- 主密钥计算: 双方通过 ECDHE 参数直接计算共享密钥(无需预主密钥):
Shared Secret = ECDH(Client_Private_Key, Server_Public_Key)
- 会话密钥派生: 使用 HKDF 算法生成加密密钥。
4. 完成握手
- 客户端发送 Finished: 验证握手完整性,切换至加密通信。
- 1-RTT 完成:相比 TLS 1.2 减少一次往返(RTT)。
三、TLS 1.2 vs TLS 1.3 关键改进
四、安全性增强
- 前向安全性(Forward Secrecy): TLS 1.3 强制使用 ECDHE,即使长期私钥泄露,历史会话也无法解密。
- 加密握手过程: TLS 1.3 对 Server Hello 之后的消息全程加密,防止握手信息被窥探。
- 0-RTT 风险: 0-RTT 数据可能被重放攻击,需业务层防御(如限制幂等操作)。
五、典型场景
- Web 访问(HTTPS): TLS 1.3 显著减少首字节时间(TTFB),提升用户体验。
- API 通信: 高频请求受益于 1-RTT 握手和会话复用。
- 物联网设备: 低功耗设备通过 0-RTT 优化能耗。
总结
- TLS 1.2:兼容性广,需谨慎配置密码套件(禁用不安全选项)。
- TLS 1.3:性能与安全性更优,逐步成为主流标准。
- 核心价值:通过密钥交换、身份验证和加密通信,保障数据机密性、完整性和真实性。