HTTPS的SSL/TLS握手过程详解
字数 1492 2025-11-04 08:34:41
HTTPS的SSL/TLS握手过程详解
1. 背景与作用
HTTPS在HTTP基础上加入SSL/TLS层,通过加密和身份验证保障通信安全。握手过程是建立安全连接的核心,需协商加密参数、验证服务器身份(可选验证客户端),并生成会话密钥。以下以TLS 1.2为例分步解析。
2. 握手流程详解
步骤1:ClientHello(客户端发起请求)
客户端向服务器发送:
- 支持的TLS版本(如TLS 1.2)。
- 客户端随机数(Client Random),用于后续密钥生成。
- 支持的密码套件列表(Cipher Suites),例如
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,包含密钥交换算法、加密算法、哈希算法。 - 压缩方法(可选,现代TLS通常禁用)。
- Session ID(若需恢复会话)。
步骤2:ServerHello(服务器响应协商)
服务器回复:
- 选择的TLS版本(双方支持的最高版本)。
- 服务器随机数(Server Random),与Client Random共同生成密钥。
- 选择的密码套件(如ECDHE_RSA)。
- Session ID(若支持会话复用)。
步骤3:服务器证书(身份验证)
服务器发送数字证书链,包含:
- 服务器公钥:用于后续密钥交换(如RSA公钥)。
- 证书颁发机构(CA)签名:客户端用预置的CA根证书验证证书真实性。
步骤4:ServerKeyExchange(密钥交换参数,仅部分算法需此步)
若使用ECDHE等临时密钥交换算法,服务器会发送:
- 椭圆曲线参数(如命名曲线secp256r1)。
- 服务器临时公钥(Server Params),用于生成预主密钥。
步骤5:ServerHelloDone
服务器告知客户端初始协商消息发送完毕。
步骤6:客户端验证证书
客户端检查:
- 证书是否由信任的CA签发。
- 证书是否在有效期内。
- 域名是否匹配。
若验证失败,连接终止。
步骤7:ClientKeyExchange(客户端密钥交换)
客户端生成:
- 预主密钥(Pre-Master Secret),用服务器公钥加密(RSA方案)或基于服务器临时公钥生成(ECDHE方案)。
- 发送加密后的预主密钥或客户端临时公钥(Client Params)。
步骤8:密钥生成
双方使用Client Random、Server Random和预主密钥,通过PRF(伪随机函数)生成:
- 主密钥(Master Secret)→ 进一步导出会话密钥(加密密钥、MAC密钥、初始化向量)。
步骤9:ChangeCipherSpec(切换加密模式)
客户端发送此消息,表示后续通信将使用协商的密钥加密。
步骤10:Finished(握手完成验证)
客户端发送加密的Finished消息,包含之前所有握手消息的哈希值,供服务器验证完整性。服务器同样回复ChangeCipherSpec和Finished消息。双方验证成功后,安全通道建立。
3. 会话复用优化
为减少握手开销,TLS支持会话复用:
- Session ID:服务器存储会话参数,客户端下次连接时直接使用ID恢复。
- Session Ticket:服务器加密会话参数发送给客户端,客户端下次连接时提交Ticket恢复会话。
4. 关键安全特性
- 前向保密:使用ECDHE等临时密钥交换算法时,即使服务器私钥泄露,历史会话也无法解密。
- 防篡改:Finished消息验证握手过程未被篡改。
- 身份验证:证书机制确保客户端与合法服务器通信。