对称密钥如何在 SSL/TLS 握手中交换?

信息安全 tls 证书 公钥基础设施 http
2021-08-16 00:28:19

我一直在阅读很多关于客户端和服务器之间的 SSL/TLS 握手的文章,而且很多文章都非常矛盾。

有人说,将用于两方通信的对称密钥从客户端传输到服务器(ofc,使用服务器的公钥加密),仅此而已。

有人说正在使用 DH 算法,首先客户端发送一个预主密钥来帮助生成共享密钥(为什么首先加密预主密钥,攻击者不会获得任何机密信息)。

令人困惑的是共享对称密钥生成的整体流程。a) 是否使用了 DH(如果没有,如何生成对称密钥,客户端建议它,通过 RSA 加密发送它,仅此而已?)

b) 如果使用 DH,谁先开始?必须有人首先建议用于生成秘密的整体素数,然后发送他们的计算(或者整体算法是否预先确定)?

1个回答

正如您已经注意到的,有两种方法可以交换对称会话密钥:通过key encipherment或通过key agreement(基于 Diffie-Hellman 算法)。两种算法不会同时使用。例如,Microsoft SChannel 客户端从服务器证书的KeyUsages扩展名(这是一个位字符串)中读取位,并根据设置的位,使用密钥交换算法。

使用密钥加密时:

  1. 客户端和服务器交换支持的密码套件并就通用密码达成一致(双方都支持)。
  2. 客户端使用选定的算法和参数生成对称密钥,并使用服务器的公钥(例如非对称加密、RSA 或 ECC)对其进行加密。
  3. 服务器使用其私钥解密密钥,此密钥用于保护会话。这里不涉及DH。

在 Diffie-Hellman(密钥协议)的情况下,谁开始没有太大区别,因为各方共享共同的素数p和生成器数g,并且双方必须就这些值达成一致。这些数字可以公开商定。所以,协议发起者只是一个协议的消息语法问题。

之后发生以下过​​程(定义明确):

  1. 客户端将其 DH 公钥发送到服务器。
  2. 服务器通过使用其私钥和客户端公钥中包含的信息来计算秘密会话密钥。
  3. 服务器将其 DH 公钥发送给客户端。
  4. 客户端通过使用其私钥和服务器公钥中包含的信息来计算秘密会话密钥。
  5. 双方现在拥有相同的会话密钥,可用于加密和解密数据。以下过程显示了为此所需的步骤。

详细的 DH 密钥交换算法在RFC2631中有描述。