TLS1.2握手过程
TLS 握手是客户端与服务器协商 TLS 会话所有参数的过程。除因连接所选特定参数产生的细微偏差外,该过程始终遵循预定义方案。
1. 密码套件
在 TLS 中,密码套件定义了连接所使用的加密算法。这包含以下信息:
- 密钥交换算法
- 用于身份验证的方法
- 提供保密性的加密算法和模式
- 提供完整性保护的 MAC 算法
以TLS 1.2 密码套件 TLS_DH_RSA_WITH_AES_128_CBC_SHA256 为例,从名字就可以知道:
- 密钥交换算法为
Diffie-Hellman (DH) - 服务器认证通过
RSA执行 - 加密算法为
AES-128,采用CBC模式 - MAC 算法为
SHA256HMAC
所有 TLS 1.2 密码套件都遵循这一命名方案。采用比非对称更有性能优势的对称加密算法。加密密钥通过密钥交换算法(一种非对称算法)进行交换。特定连接所使用的密码套件是在握手阶段协商确定的。
使用 TLS_DHE 和 TLS_ECDHE 密钥交换算法的密码套件提供前向保密(PFS)。这意味着即使攻击者在未来获取了会话密钥,也无法解密过去的通信消息。这保护了历史通信免受未来可能发生的潜在泄露风险的影响。因此,如果客户端支持,优先选择具备 PFS 特性的密码套件是更理想的做法。
2. 握手过程概述
握手过程中,客户端与服务器建立连接并协商所有必要参数,以建立用于应用数据传输的安全通道。握手遵循明确定义的流程,具体步骤会根据协商出的加密套件略有差异。
- 客户端首先发送
ClientHello消息给服务端,告知希望与其建立安全连接。并提供客户端支持的最新 TLS 版本以及客户端支持的加密套件列表 - 服务端回复
ServerHello消息作为响应,服务器会选择等于或低于客户端提供版本的 TLS 版本,同时从ClientHello提供的加密套件中选择一个 - 达成一致后,服务器通过
Certificate消息提供证书,向客户端证明其身份 - 若双方协商使用前向保密密码套件,服务器将在
ServerKeyExchange消息中继续共享新的密钥材料。该消息包含密钥共享及数字签名,随后发送ServerHelloDone消息 - 客户端通过发送
ClientKeyExchange(客户端密钥交换)消息进行响应,其中包含客户端的密钥份额。至此,密钥交换阶段结束,通信双方共同拥有了一个秘密值(Secret),该秘密值将用于推导出共享的对称密钥。随后,双方都会发送ChangeCipherSpec(更改密码规范)消息,以表明此后的所有消息都将使用计算出的对称密钥进行加密。从这一刻起,所有数据都经过了加密处理并受到 MAC(消息认证码)的保护
3. 用Wireshark 分析 TLS 1.2 握手过程
过滤tls可以发现 TLS的握手过程
展开 ClientHello 消息时,可以获取到客户端发送的 TLS 版本和支持的密码套件
在 ServerHello 消息中进行相同操作,可以揭示服务器为此 TLS 连接选择的 TLS 版本和密码套件
最后,检查客户端在 ClientKeyExchange 消息中发送的密钥信息。在这里选择了 TLS_RSA 密码套件。因此,客户端发送的密钥信息是使用服务器公钥加密的共享密钥。
由于密码套件不提供前向保密(PFS),因此不存在
Server Key Exchange消息




