请解释 SSL/TLS 握手过程。

推荐答案

SSL/TLS 握手过程主要分为以下几个步骤,用于在客户端和服务器之间建立安全的加密连接:

  1. 客户端Hello (Client Hello): 客户端向服务器发送一个 Client Hello 消息,其中包含:
    • 客户端支持的 TLS 版本号
    • 客户端支持的加密套件列表(包括加密算法、密钥交换算法、哈希算法等)
    • 一个随机数 (Client Random)
  2. 服务器Hello (Server Hello): 服务器收到 Client Hello 后,选择一个客户端和服务器都支持的 TLS 版本号、加密套件,并向客户端发送一个 Server Hello 消息,其中包含:
    • 服务器选择的 TLS 版本号
    • 服务器选择的加密套件
    • 一个随机数 (Server Random)
    • 服务器的数字证书
  3. 服务器证书验证 (Certificate Verification): 客户端收到服务器的证书后,会进行如下验证:
    • 验证证书的有效期
    • 验证证书是否被吊销
    • 验证证书是否由可信任的 CA 机构签名
    • 验证证书上的域名是否与请求的域名一致
  4. 密钥交换 (Key Exchange): 客户端与服务器协商生成会话密钥(用于后续数据加密)。密钥交换的方式取决于之前协商的加密套件。常见的密钥交换方式包括:
    • RSA: 客户端用服务器证书中的公钥加密一个预主密钥 (Pre-Master Secret),并发送给服务器。服务器用自己的私钥解密得到 Pre-Master Secret。
    • Diffie-Hellman (DH/ECDH): 客户端和服务器分别生成自己的公私钥对,并通过公开的信息计算出相同的 Pre-Master Secret。
    • 双方根据 Pre-Master Secret 和客户端/服务器的随机数生成最终的会话密钥。
  5. 客户端密钥交换完成 (Client Key Exchange Finished) 和 更改加密规范 (Change Cipher Spec) 和加密握手信息 (Encrypted Handshake Message):
    • 客户端发送 Client Key Exchange消息(如果使用 RSA 方式),将加密过的预主密钥发给服务端。
    • 客户端发送 Change Cipher Spec 消息通知服务器后续报文将使用加密方式传输。
    • 客户端发送 Encrypted Handshake Message,用协商好的会话密钥加密所有之前握手过程中产生的信息的哈希值,用于服务端验证握手完整性。
  6. 服务器密钥交换完成 (Server Key Exchange Finished) 和 更改加密规范 (Change Cipher Spec) 和加密握手信息 (Encrypted Handshake Message):
    • 服务器发送 Change Cipher Spec 消息通知客户端后续报文将使用加密方式传输。
    • 服务器发送 Encrypted Handshake Message,用协商好的会话密钥加密所有之前握手过程中产生的信息的哈希值,用于客户端验证握手完整性。
  7. 握手完成 (Handshake Complete): 客户端和服务器都成功验证了对方的加密信息,握手过程完成,后续通信将使用会话密钥进行加密传输。

本题详细解读

SSL/TLS 握手是建立安全连接的关键步骤,它确保客户端和服务器在交换敏感信息之前,已经通过加密手段保护了数据传输的机密性和完整性。

1. Client Hello:

  • 目的: 客户端发起握手,告知服务器自身的能力。
  • 关键信息:
    • TLS 版本: 客户端支持的 TLS 协议版本(如 TLS 1.2、TLS 1.3)。客户端会列出它支持的所有版本,服务器从中选择一个双方都支持的最高版本。
    • 加密套件: 客户端支持的加密算法列表,例如,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384。 服务器从中选择一个,这决定了后续使用的加密算法、密钥交换算法、哈希算法。
    • Client Random: 一个随机数,用于后续生成会话密钥。每次握手这个值都是随机的。

2. Server Hello:

  • 目的: 服务器回应客户端的握手请求,并选择好双方使用的加密参数。
  • 关键信息:
    • TLS 版本: 服务器选择的 TLS 版本,通常是客户端支持的最高版本。
    • 加密套件: 服务器选择的加密套件,必须是客户端列表中也存在的。
    • Server Random: 服务器生成的随机数,用于后续生成会话密钥。
    • 服务器证书: 服务器的数字证书,其中包含了服务器的公钥。

3. 服务器证书验证 (Certificate Verification):

  • 目的: 客户端验证服务器的身份,确认服务器是合法的,防止中间人攻击。
  • 验证步骤:
    • 证书有效期: 检查证书是否过期或未生效。
    • 证书吊销: 检查证书是否已经被吊销 (通过 CRL 或者 OCSP)。
    • CA 机构: 检查证书是否由受信任的 CA 机构签名。客户端会维护一个信任的 CA 机构列表。
    • 域名一致性: 检查证书上的域名是否与客户端访问的域名一致。这是为了防止 DNS 劫持或中间人攻击。

4. 密钥交换 (Key Exchange):

  • 目的: 安全地生成客户端和服务器之间共享的会话密钥。
  • 原理: 双方通过某种方式,协商出一个只有双方才知道的 Pre-Master Secret。然后双方分别使用 Pre-Master SecretClient Random, Server Random 计算出会话密钥(Session Key)。
  • 常见密钥交换算法:
    • RSA: 客户端使用服务器公钥加密 Pre-Master Secret,服务器使用私钥解密。 这种方式易于实现,但安全性不如 Diffie-Hellman 算法高,而且存在前向安全性问题。
    • Diffie-Hellman (DH/ECDH): 更安全,可以实现 Perfect Forward Secrecy (PFS),即使服务器的私钥泄露,以前的会话密钥也无法被破解。 它通过交换公钥计算出相同的密钥。其中 ECDH 是 DH 的椭圆曲线版本,在效率和安全性上都更高。

5 & 6. 客户端/服务器 密钥交换完成 (Key Exchange Finished) 和 更改加密规范 (Change Cipher Spec) 和加密握手信息 (Encrypted Handshake Message):

  • 目的: 通知对方后续报文将加密,并验证握手过程的完整性。
  • 步骤:
    • Client Key Exchange (如果采用 RSA): 客户端使用服务器公钥加密 Pre-Master Secret,发送给服务器。
    • Change Cipher Spec: 通知对方切换到加密模式。
    • Encrypted Handshake Message: 用协商好的会话密钥加密所有之前握手过程中产生的信息的哈希值。 这用于验证握手信息是否被篡改。

7. 握手完成 (Handshake Complete):

  • 目的: 表示双方握手成功,可以开始加密通信。
  • 后续: 客户端和服务器使用协商好的会话密钥进行数据加密和解密,确保数据的安全传输。

总结: (此部分根据要求,不添加)

纠错
反馈