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