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

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

Share facebook icon linkedin icon twitter icon email icon

TLS 握手

学习目标

阅读本文后,您将能够:

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

什么是 TLS 握手?

the TLS Handshake

TLS 是旨在保护 Internet 通信安全的加密协议。TLS 握手是启动使用 TLS 加密的通信会话的过程。在 TLS 握手期间,两个通信方交换消息以相互确认,彼此验证,确立它们将使用的加密算法,并就会话密钥达成共识。TLS 握手是 HTTPS 工作原理的基础部分。

TLS 与 SSL 握手

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

何时进行 TLS 握手?

每当用户通过 HTTPS 导航到网站,并且浏览器首先开始查询网站的源站服务器时,都会进行 TLS 握手。每当其他任何通信使用 HTTPS(包括 API 调用和 HTTPS 上的 DNS 查询)时,也会发生 TLS 握手。

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

TLS 握手期间会发生什么?

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

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

TLS 握手有哪些步骤?

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

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

  1. “客户端问候”消息:客户端通过向服务器发送“hello”消息来发起握手。消息中包含客户端支持的 TLS 版本、支持的密码套件,以及称为“客户端随机数”的一串随机字节。
  2. “服务器问候”消息:作为对客户端问候消息的答复,服务器发送一条消息,内含服务器的 SSL 证书、服务器选择的密码套件,以及“服务器随机数”,即由服务器生成的另一串随机字节。
  3. 身份验证:客户端通过 SSL 证书的证书颁发机构验证服务器的 SSL 证书。这将确认服务器确实是其声称的身份,并且客户端正在与域的实际所有者交互。
  4. 预主机密:客户端再发送一串随机字节,即“预主机密”。预主机密使用公钥加密,并且只能由服务器使用私钥解密。(客户端从服务器的 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. 客户端就绪:
  8. 与 RSA 握手相同。
  9. 服务器就绪
  10. 实现安全对称加密

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

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

什么是密码套件?

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

要了解有关 TLS/SSL 的更多信息,请参阅 SSL 如何工作?要测试网站是否正确使用 TLS,请访问 Cloudflare 诊断中心