Published on

TLS 握手协议

传输层安全性协议 (Transport Layer Security, TLS),其前身为安全套接层 (Secure Sockets Layer, SSL),是保障互联网通信安全和数据隐私的基石。它在不可靠的传输层协议(如 TCP)之上,构建了一个加密的、可认证的通信通道,为上层的应用层协议(如 HTTP,从而形成 HTTPS)提供安全保障。TLS 的所有安全特性,都源于一次被称为TLS 握手 (TLS Handshake) 的、在数据传输开始前进行的复杂协商过程。

TLS 握手的核心目标

一次成功的 TLS 握手,旨在达成以下三个核心安全目标:

  1. 加密 (Encryption): 协商出一个双方共享的对称密钥 (symmetric key),用于加密后续传输的应用数据,保证通信的机密性
  2. 认证 (Authentication): 客户端验证服务器的数字证书 (digital certificate),以确认服务器的真实身份,防止中间人攻击。
  3. 完整性 (Integrity): 协商出的密钥也用于生成消息认证码 (Message Authentication Code, MAC),以检测数据在传输过程中是否被篡改。

TLS 1.2 握手流程详解

经典的 TLS 1.2 握手过程,是在 TCP 三次握手成功建立连接后进行的,通常需要两次完整的网络往返 (2-RTT)。

阶段一:协议协商 (ClientHello & ServerHello)

  • 客户端首先发送一个 ClientHello 消息,其中包含了它支持的 TLS 最高版本号、一个客户端生成的随机数,以及一个它支持的加密套件 (cipher suites) 列表。
  • 服务器接收后,如果支持客户端的协议,则返回一个 ServerHello 消息,从中选定一个双方都支持的加密套件,并附上一个服务器生成的随机数。如果不支持,则中止连接。

阶段二:证书验证与信任链

  • 服务器会发送其数字证书给客户端。此证书由一个受信任的证书颁发机构 (Certificate Authority, CA) 签发,其中包含了服务器的域名、公钥等信息。
  • 客户端接收到证书后,会进行验证。
信任链 (Chain of Trust)

服务器证书的信任验证遵循递归签名路径:

服务器证书 ← 中间 CA 证书 ← 根 CA 证书

客户端系统预装根 CA 信任列表,通过验证整条签名链的有效性来确认服务器身份。若任一环节签名无效或不在信任列表中,握手即终止。

阶段三:密钥交换与会话建立

  • 非对称加密的应用: 客户端验证证书成功后,就确认了服务器的身份及其公钥的真实性。但由于非对称加密(公钥/私钥)的计算开销巨大,不适合用于加密所有通信内容。
  • 共享密钥的生成: 为了平衡安全与性能,TLS 采用非对称加密来安全地协商出一个对称加密所需的共享会话密钥
    1. 客户端生成一个随机的“预主密钥 (pre-master secret)”。
    2. 客户端使用从服务器证书中获取的公钥,对这个预主密钥进行加密,并通过 ClientKeyExchange 消息发送给服务器。
    3. 服务器使用自己的私钥解密,获取到这个预主密钥。
    4. 此时,客户端和服务器都拥有了相同的三个随机数(客户端随机数、服务器随机数、预主密钥),它们会使用一个相同的伪随机函数,将这三个数混合计算,最终生成一个完全相同的会话密钥 (session key)
  • 验证: 双方分别发送一个用刚刚生成的会话密钥加密的 Finished 消息,对方如果能成功解密,则证明整个握手过程成功。

阶段四:安全通信

握手成功后,双方就使用这个高效的、对称的会话密钥,来加密和解密所有后续的应用层数据(如 HTTP 请求和响应)。

TLS 1.3 的演进与优化

TLS 1.3 是对 1.2 的一次重大升级,其核心目标是提升性能增强安全性

TLS 1.3 的关键改进

  • 简化的握手 (1-RTT): TLS 1.3 将握手过程从两次网络往返(2-RTT)减少到一次(1-RTT)。客户端在 ClientHello 中就会推测性地发送密钥交换所需的信息,服务器可以在一次响应中完成所有协商和证书发送。
  • 0-RTT 连接恢复: 如果客户端之前访问过该网站,可以在 ClientHello 中直接发送用上次会话中获取到的密钥加密的应用层数据,实现零往返时间 (Zero Round-Trip Time) 的连接恢复。
  • 更强的安全性: 废除了所有已知存在漏洞的、过时的加密算法(如 RSA 密钥交换),并强制要求所有密钥交换算法都具备前向保密性 (Perfect Forward Secrecy)