如果公钥取决于算法的选择,如何将公钥绑定到证书?

信息安全 tls 证书 公钥基础设施 不对称 证书固定
2021-08-14 14:08:16

相同的公钥可以与 RSA、椭圆曲线或其他非对称加密算法一起使用吗?如果不是,如何将公钥绑定到 X.509 证书?据推测,您必须在确定公钥之前知道算法选择,并且算法的选择仅在握手期间确定。

3个回答

相同的公钥可以与 RSA、椭圆曲线或其他非对称加密算法一起使用吗?

不,算法是密钥中固有的。

如果不是,如何将公钥绑定到 X.509 证书?

它不绑定到证书,但它是证书的一部分

据推测,您必须在确定公钥之前知道算法选择,并且算法的选择仅在握手期间确定。

如果客户端仅提供需要基于 RSA 的身份验证的密码1,而服务器只有 ECC 证书,则握手将失败,因为双方不支持共享密码。

通常,客户端在密码中显示对 RSA 和 ECC 证书的支持,因此无论服务器拥有哪种证书,都可以找到共享密码。在某些情况下,服务器也有这两种类型的证书。


1这有点简化。在 TLS 1.3 中,证书算法不再包含在密码套件中。但是有一个signature_algorithms_cert扩展。甚至这个语句仍然被简化,因为还有一个signature_algorithms扩展。有关更多信息,请参阅RFC 8446 第 4.2.3 节

公钥与签名算法

RSA

为简单起见,让我们从 RSA 开始。根据RFC 8017

3.1。RSA 公钥

就本文档而言,RSA 公钥由两部分组成:

    n        the RSA modulus, a positive integer
    e        the RSA public exponent, a positive integer

典型值如下:

modulus = 0xfb1199ff0733f6e805a4fd3b36ca68...837a63
exponent = 65,537

所以一个 RSA 公钥只是一个非常大的整数。现在,当您实际使用该公钥时,例如生成数字签名,您需要选择使用哪种算法。例如,相同的 RSA 密钥可以与以下任何签名算法一起使用:

  • sha256WithRSAEncryption(在RFC 5754中定义)
  • sha512WithRSAEncryption(在RFC 5754中定义)
  • id-RSASSA-PSS-SHAKE256(在RFC 8692中定义)

椭圆曲线

椭圆曲线密钥的结构与 RSA 不同,它在RFC 5480中定义,涉及:

ECPoint ::= OCTET STRING

ECParameters ::= CHOICE {
   namedCurve         OBJECT IDENTIFIER
   -- implicitCurve   NULL
   -- specifiedCurve  SpecifiedECDomain
 }

因此,EC 密钥与为 RSA 设计的签名算法不兼容。并且与 RSA 类似,椭圆曲线公钥可以与一种或多种不同的签名算法兼容。

TLS 密码套件协商

这里的重点是,即使你知道你的公钥是 RSA,你仍然需要选择其他的加密算法来结合它来产生签名;选择填充方案(PKCS#1_v1.5 或 PSS),并选择散列函数(SHA-256、SHA-512、SHAKE-256 等)。这个概念被称为密码套件,TLS 客户端和服务器将在使用证书之前进行协商。

例如,如果客户端和服务器同意以下任何 TLS 1.2 密码套件列表是可接受的:

ECDHE-RSA-AES128-GCM-SHA256    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(128)             Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESGCM(256)             Mac=AEAD
ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(256)             Mac=AEAD

然后服务器可以使用指定的散列函数自由使用基于 RSA 或椭圆曲线的证书(注意第二个位置的“RSA”或“ECDSA”)。

但是,如果客户端和服务器只同意这些,那么服务器最好有一个基于 RSA 的证书:

ECDHE-RSA-AES128-GCM-SHA256    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(128)             Mac=AEAD
ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(256)             Mac=AEAD

请注意,在 TLS 1.3 中,签名算法不再作为密码套件的一部分进行协商,我相信客户端可以在握手的单独步骤中接受或拒绝证书。

TLS_AES_128_GCM_SHA256         TLSv1.3  Kx=any   Au=any    Enc=AESGCM(128)             Mac=AEAD
TLS_AES_256_GCM_SHA384         TLSv1.3  Kx=any   Au=any    Enc=AESGCM(256)             Mac=AEAD

证书跟踪签名散列和公钥散列。

这是为了验证证书是曾经声称的形式。

虽然您可以使用多个密钥交叉签署证书,但我建议您不要这样做.. 它使验证成为地狱。

最好为每种密钥类型使用不同的(叶)证书。(并使用中间体作为验证证书)。

这对会话的算法没有影响。它仅与 PKI 方案本身的算法有关。(因此 RSA 证书可用于使用 GCM 加密的对称加密隧道建立 EC 会话。