证书颁发机构是否需要遵守 CSR 中指定的签名算法(散列)?

信息安全 tls 证书 证书颁发机构 x.509
2021-09-06 08:58:51

我在玩一些签名算法,试图确定我使用的那些 CA 目前正在颁发 SHA2 证书。

gnutls-certtool我生成了一个指定 SHA256 哈希的CSR(使用hash参数和openssl req参数-sha256),并且 CSR 清楚地显示sha256WithRSAEncryption为签名算法。

$ openssl req -noout -text -in test.csr

Certificate Request:
    ...
    Signature Algorithm: sha256WithRSAEncryption
        ...

但是,来自 CA 的结果证书使用sha1WithRSAEncryption.

$ openssl x509 -noout -text -in test.crt

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: ... (...)
        Signature Algorithm: sha1WithRSAEncryption

当然,使用--hash SHA1( sha1WithRSAEncryptionhash) 生成 CSR 将导致使用生成的证书sha1WithRSAEncryption(如预期的那样)。

CA 声明哈希应该被指定为订单的一部分,而不是 CSR(这是我在任何情况下都不能做的事情,因为我是通过第三方服务提交订单的)。

因此问题。CA 是否应该遵守 CSR 中指定的哈希算法?

2个回答

创建 CSR 时指定的签名算法对应于用于对请求本身进行签名的消息摘要,并不打算要求 CA 在签署您的证书时首选该算法。

CSR 中使用的 MD 确定了您的请求的可信度,但并不暗示在证书上使用什么算法,因为签名不依赖于该摘要,而是依赖于公钥。

大多数 CA 坚持对特定颁发证书使用相同的算法,除非发现它是“弱”的,而忽略您在请求中使用的消息摘要。

一个好的 CA 会拒绝任何使用 MD5 签名的 CSR(以防万一,因为他们不应该信任您),并且应该强制您对从今天(2014 年)开始假装使用超过两年的任何证书使用 SHA256,因为 Microsoft (可能还有其他人)将在 2017 年 1 月拒绝使用 SHA-1 或更低版本签名的证书。

根据我的经验,CA 确实有自己的设置,而且他们通常不愿意(或者根本无法,因为它已连接到他们的软件中)来更改其中的任何内容。我说的是强制性主题字段、密钥用法、扩展密钥用法……

例如,您想在 Subject 中包含 L、ST、C,但 CA 将被切断,您只能获得 C=county 的证书。或者您提交一个简单的 .csr 并获得具有特殊扩展密钥用法的证书,例如客户端身份验证 (1.3.6.1.5.5.7.3.2) 和服务器身份验证 (1.3.6.1.5.5.7.3.1)。很多时候,您还可以免费获得等同于 CN 的 SAN。

如果您想要使用 sha1 或 sha256 签署证书,您应该询问 RA=registration authority。RA 将实际请求发送到 CA 并可以设置设置,包括使用的散列算法。

CA 仅使用 .csr 文件中的签名来验证您是否拥有私钥,仅此而已。