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 算法为 SHA256 HMAC

所有 TLS 1.2 密码套件都遵循这一命名方案。采用比非对称更有性能优势的对称加密算法。加密密钥通过密钥交换算法(一种非对称算法)进行交换。特定连接所使用的密码套件是在握手阶段协商确定的。

使用 TLS_DHETLS_ECDHE 密钥交换算法的密码套件提供前向保密(PFS)。这意味着即使攻击者在未来获取了会话密钥,也无法解密过去的通信消息。这保护了历史通信免受未来可能发生的潜在泄露风险的影响。因此,如果客户端支持,优先选择具备 PFS 特性的密码套件是更理想的做法。

2.  握手过程概述

握手过程中,客户端与服务器建立连接并协商所有必要参数,以建立用于应用数据传输的安全通道。握手遵循明确定义的流程,具体步骤会根据协商出的加密套件略有差异。

  • 客户端首先发送 ClientHello 消息给服务端,告知希望与其建立安全连接。并提供客户端支持的最新 TLS 版本以及客户端支持的加密套件列表
  • 服务端回复ServerHello消息作为响应,服务器会选择等于或低于客户端提供版本的 TLS 版本,同时从 ClientHello 提供的加密套件中选择一个
  • 达成一致后,服务器通过 Certificate 消息提供证书,向客户端证明其身份
  • 若双方协商使用前向保密密码套件,服务器将在 ServerKeyExchange 消息中继续共享新的密钥材料。该消息包含密钥共享及数字签名,随后发送 ServerHelloDone 消息
  • 客户端通过发送 ClientKeyExchange(客户端密钥交换)消息进行响应,其中包含客户端的密钥份额。至此,密钥交换阶段结束,通信双方共同拥有了一个秘密值(Secret),该秘密值将用于推导出共享的对称密钥。随后,双方都会发送 ChangeCipherSpec(更改密码规范)消息,以表明此后的所有消息都将使用计算出的对称密钥进行加密。从这一刻起,所有数据都经过了加密处理并受到 MAC(消息认证码)的保护

Pasted image 20260308023512.png

3.  用Wireshark 分析 TLS 1.2 握手过程

过滤tls可以发现 TLS的握手过程
Pasted image 20260308023616.png

展开 ClientHello 消息时,可以获取到客户端发送的 TLS 版本和支持的密码套件
Pasted image 20260308023633.png

在 ServerHello 消息中进行相同操作,可以揭示服务器为此 TLS 连接选择的 TLS 版本和密码套件
Pasted image 20260308023659.png

最后,检查客户端在 ClientKeyExchange 消息中发送的密钥信息。在这里选择了 TLS_RSA 密码套件。因此,客户端发送的密钥信息是使用服务器公钥加密的共享密钥。
Pasted image 20260308023732.png

由于密码套件不提供前向保密(PFS),因此不存在 Server Key Exchange 消息