TLS 握手期间会发生什么?| SSL 握手

在 TLS/SSL 握手过程中,客户端和服务器交换 SSL 证书、密码套件要求以及为创建会话密钥而随机生成的数据。

学习目标

阅读本文后,您将能够:

  • 了解什么是 TLS 握手
  • 了解 TLS 握手的目的
  • 说明 TLS 握手的步骤
  • 探索不同类型的 TLS 握手

复制文章链接

什么是 TLS 握手?

TLS 是一种旨在保护互联网通信安全的加密协议。TLS 握手是启动 TLS 加密通信会话的过程。在 TLS 握手过程中,通信双方交换消息以相互确认,彼此验证,确立它们将使用的加密算法,并生成一致的会话密钥。TLS 握手是 HTTPS 工作原理的基础部分。

TLS 与 SSL 握手

SSL (安全套接字层)是为 HTTP 开发的原始加密协议。不久前,SSL 被 TLS (传输层安全性)所取代。SSL 握手现在称为 TLS 握手,尽管“SSL”这个名称仍在广泛使用。

何时进行 TLS 握手?

用户导航到一个使用 HTTPS 的网站,浏览器首先开始查询网站的原始服务器,这时就会发生 TLS 握手。在任何其他通信使用 HTTPS 时(包括 API 调用和 DNS over HTTPS 查询),也会发生 TLS 握手。

通过 TCP 握手打开 TCP 连接后,将发生 TLS 握手。

TLS 握手期间会发生什么?

在 TLS 握手过程中,客户端和服务器一同执行以下操作:

  • 指定将要使用的 TLS 版本(TLS 1.0、1.2、1.3 等)
  • 决定将要使用哪些密码套件(见下文)
  • 通过服务器的公钥和 SSL 证书颁发机构的数字签名来验证服务器的身份
  • 生成会话密钥,以在握手完成后使用对称加密

TLS 握手有哪些步骤?

TLS 握手是由客户端和服务器交换的一系列数据报或消息。TLS 握手涉及多个步骤,因为客户端和服务器要交换完成握手和进行进一步对话所需的信息。

TLS 握手的确切步骤将根据所使用的密钥交换算法的类型以及双方支持的密码套件而有所不同。RSA 密钥交换算法最为常用。具体如下:

  1. “客户端问候(client hello)” 消息: 客户端通过向服务器发送“问候”消息来开始握手。该消息将包含客户端支持的 TLS 版本,支持的密码套件,以及称为一串称为“客户端随机数(client random)”的随机字节。
  2. “服务器问候(server hello)”消息: 作为对 client hello 消息的回复,服务器发送一条消息,内含服务器的 SSL 证书、服务器选择的密码套件,以及“服务器随机数(server random)”,即由服务器生成的另一串随机字节。
  3. 身份验证: 客户端使用颁发该证书的证书颁发机构验证服务器的 SSL 证书。此举确认服务器是其声称的身份,且客户端正在与该域的实际所有者进行交互。
  4. 预主密钥: 客户端再发送一串随机字节,即“预主密钥(premaster secret)”。预主密钥是使用公钥加密的,只能使用服务器的私钥解密。(客户端从服务器的 SSL 证书中获得公钥。)
  5. 私钥被使用:服务器对预主密钥进行解密。
  6. 生成会话密钥:客户端和服务器均使用客户端随机数、服务器随机数和预主密钥生成会话密钥。双方应得到相同的结果。
  7. 客户端就绪:客户端发送一条“已完成”消息,该消息用会话密钥加密。
  8. 服务器就绪:服务器发送一条“已完成”消息,该消息用会话密钥加密。
  9. 实现安全对称加密:已完成握手,并使用会话密钥继续进行通信。

所有 TLS 握手均使用非对称加密(公钥和私钥),但并非全都会在生成会话密钥的过程中使用私钥。例如,短暂的 Diffie-Hellman 握手过程如下:

  1. 客户端问候:客户端发送客户端问候消息,内含协议版本、客户端随机数和密码套件列表。
  2. 服务器问候:服务器以其 SSL 证书、其选定的密码套件和服务器随机数回复。与上述 RSA 握手相比,服务器在此消息中还包括以下内容(步骤 3):
  3. 服务器的数字签名:服务器使用其私钥对客户端随机数、服务器随机数及其 DH 参数* 进行加密。加密后的数据用作服务器的数字签名,从而确定服务器具有与 SSL 证书中的公钥相匹配的私钥。
  4. 确认数字签名:客户端使用公钥解密服务器的数字签名,验证服务器控制私钥并且是其声称的身份。客户端 DH 参数:客户端将其 DH 参数发送到服务器。
  5. 客户端和服务器计算预主密钥:客户端和服务器使用交换的 DH 参数分别计算匹配的预主密钥,而不像 RSA 握手那样由客户端生成预主密钥并将其发送到服务器。
  6. 创建会话密钥:与 RSA 握手中一样,客户端和服务器现在从预主密钥、客户端随机数和服务器随机数计算会话密钥。
  7. 客户端就绪:与 RSA 握手相同。
  8. 服务器就绪
  9. 实现安全对称加密

*DH 参数:DH 代表 Diffie-Hellman。Diffie-Hellman 算法使用指数计算得出相同的预主机密。服务器和客户端各自提供用于计算的参数,并且组合后在每一端产生不同的计算,但得出相等的结果。

要详细了解临时 Diffie-Hellman 握手与其他类型握手之间的区别,以及它们如何实现前向保密,请参阅什么是 无密钥 SSL?

什么是密码套件?

密码套件是一组用于建立安全通信连接的加密算法。(加密算法是对数据执行的一组数学运算,以使数据显得随机。)广泛使用的密码套件有多种,而且 TLS 握手的一个重要组成部分就是对这个握手使用哪一密码套件达成一致意见。

要进一步了解 TLS/SSL,请参阅 SSL 的工作原理。要测试某个网站是否正确使用了 TLS,请访问 Cloudflare Diagnostic Center