在 Diffie Hellman 密钥交换技术中,双方就一个公共参数达成一致,g然后他们生成他们的私有参数a和b。然后他们交换g^a和g^b。现在他们可以计算出通用密钥了g^ab。
但我的问题是他们如何就参数 g 达成一致。它在证书中指定吗?如果是,是否需要特殊类型的证书?这种类型的证书中有哪些信息?
您是否需要特殊类型的证书才能使用 Diffie Hellman 作为 SSL 中的密钥交换协议?
Ephemeral Diffie-Hellman 密钥交换不需要特殊证书,但需要服务器密钥交换消息。固定 DH 需要特殊证书。正如 TLS 规范所说:
- 在第 7.4.3 节中:
The server key exchange message is sent by the server only when the server certificate message (if sent) does not contain enough data to allow the client to exchange a premaster secret. This is true for the following key exchange methods: DHE_DSS DHE_RSA DH_anon It is not legal to send the server key exchange message for the following key exchange methods: RSA DH_DSS DH_RSA此消息的含义:
This message conveys cryptographic information to allow the client to communicate the premaster secret: either an RSA public key with which to encrypt the premaster secret, or a Diffie-Hellman public key with which the client can complete a key exchange (with the result being the premaster secret).
- 在附录 A.5(关于非临时 DH 密码套件)中:
以下 CipherSuite 定义用于服务器认证(以及可选的客户端认证)Diffie-Hellman。DH 表示密码套件,其中服务器的证书包含由证书颁发机构 (CA) 签名的 Diffie-Hellman 参数。[...]
- 在附录 F.1.1.3中:
当使用 Diffie-Hellman 密钥交换时,服务器可以提供包含固定 Diffie-Hellman 参数的证书,或者使用服务器密钥交换消息发送一组使用 DSS 或 RSA 证书签名的临时 Diffie-Hellman 参数。临时参数在签名之前使用 hello.random 值进行哈希处理,以确保攻击者不会重播旧参数。无论哪种情况,客户端都可以验证证书或签名,以确保参数属于服务器。
请注意,带有 DH 参数的证书无论如何都很少见。
Stephen Henson(来自 OpenSSL)说以下(诚然很久以前):
我到处问过,但我还没有看到一个 DH 证书的例子。由此我可以得出结论,它们不是很常见。
Nelson Bolyard(来自 Mozilla NSS)最近说:
[...] 我问是因为我不知道今天有任何公共 CA 颁发此类证书。我所知道的最后一个 CA 是为 Fortezza 卡颁发证书的美国国防部 CA。
我怀疑对这些证书的需求很少。这需要 CA 做更多的工作,现在使用 EDH 一样容易,并且可以使用它们的密码套件没有得到广泛支持。在支持的加密套件的最新版本的Java 7名单没有列出任何DH_RSA或DH_DSS加密套件(仅DH_anon和EDH)。
有两种自然的方法可以做到这一点。
该规范可以识别一组预定义的组。每个端点的组参数都硬编码在两个端点使用的软件中。然后,公钥指定要与哪些组一起使用。在 Diffie-Hellman 的情况下,组参数是g和p,因此公钥中的组标识符决定了g的值。由于组标识符在公钥中,因此它包含在证书中。
或者,组参数本身(g和p)可以作为公钥的一部分包含在证书中。
无论哪种方式都有效。无论哪种方式,证书中的信息都允许您确定要使用的g和p的正确值。除此之外,没有什么特别的要求。