两个 CA 可以使用相同的密钥签署 X.509 证书吗?

两个 CA 可以使用相同的密钥签署 X.509 证书吗?

我已经建立了一个私有 CA 来签署本地证书。CA 证书中有一个拼写错误,我想在 CA 的未来版本中修复它,但我希望保持已颁发证书的可信度。

假设我给了 Alice 根 CA 证书,这样她就会信任我颁发的证书。现在,我使用生成第一个 CA 时使用的相同私钥,制作了没有拼写错误的新版 CA。我将新版 CA 交给 Bob。

是否可以让单个颁发的证书受到 Alice 和 Bob 的信任?

OpenSSL 命令是什么样的?

答案1

证书的唯一性由其公钥和主题的组合定义。如果您更改其中之一,则证书将不同。如果您保留两者,但更改其他内容,则它们将被视为相同的证书。对于 CA 也是如此,它同样由其自身证书中的公钥和主题的组合以及颁发证书中的颁发者字段和签名字段(从 CA 的密钥等中派生而来)定义。

证书只有一个颁发者字段和一个签名字段,这意味着一个证书只能由一个 CA 签名。请注意,一个实体可以拥有由不同 CA 签名的多个证书,但这与此无关。

在您的情况下,由于您的公钥是固定的,如果您更改主题,那么您将拥有不同的证书,因此它是一个不同的 CA。

例如,如果输入错误,即到期日期的年份错误,那么您可以按照您的建议进行操作。然后,您可以从任一 CA 向您的最终实体颁发一个证书,并且 Alice 和 Bob 都会信任该证书。当然,在此示例中,信任链将在不同时间到期。

不过这还是有点儿像黑客行为。如果你想解决这个问题,请向 Alice 和 Bob 颁发相同的根 CA 证书,并从 Alice 的信任锚存储中删除原始证书。

答案2

如果除了密钥对之外,姓名CA(在主题和颁发者字段中)保持完全相同(没有“拼写错误”),并且如果(任何)现有子证书使用颁发者+序列号形式的 AKI(如果您使用 openssl 则很可能如此)那么序列号也是如此,那么是的. 例如参见:
https://security.stackexchange.com/questions/17331/is-it-possible-to-modify-a-ca-without-having-to-reissue-all-of-the-derived-certi
https://security.stackexchange.com/questions/234547/impact-of-root-certificate-renewal
https://serverfault.com/questions/861975/re-issuing-self-signed-root-ca-without-invalidating-certificates-signed-by-it

有 3 种方法可以实现此openssl目的:

  1. 按照通常的步骤从现有密钥创建自签名证书:openssl req -new -x509在配置文件中指定密钥,或者使用-key(但不是 -newkeyprompt=no)。在配置文件中使用或指定主题(和发行者)名称-subj——但无论哪种方式,您都必须完全正确。如果需要(或想要),请使用 指定序列号-set_serial。使用 指定有效性-days。在配置文件中指定扩展名(x509_extensions在配置或-extensions命令行中选择),或者仅在 1.1.1 中使用-addext

    的配置文件req必须可作为文件供程序访问,但不一定是“真实”(永久)文件。特别是在 Unix 上使用某些 shell 时,您可以使用进程替换<(...)(或在 zsh 中=(...))创建可能包含动态内容的临时文件。在多个堆栈上,有相当多的 A 是关于在 1.1.1 之前(或没有)使用该技术在命令行上提供 SAN。

  2. 使用openssl x509 -x509toreq -in oldcert -signkey keyfile -out csr(您可以使用 stdin 和 stdout 重定向代替-in -out),然后是openssl x509 -in csr -req -signkey keyfile [-set_serial n] -days d -extfile file [-extensions section] -out newcert(ditto)。您可以将它们组合成管道:openssl x509 -x509toreq ... | openssl x509 -req ...。对于第二步,您可以改用openssl req -in csr -x509(不带-new)和其他选项,与 #1 相同,但在 1.1.0 以上版本中,您必须明确指定输入 CSR 文件,而不是通过重定向或管道。

  3. 使用openssl x509 -in oldcert -signkey keyfile -clrext -extfile file [-extensions section]。这将自动保留序列号;即使你想更改它也无法更改。-preserve_dates在 1.1.1 中还有一个选项,只保留现有的有效期,而不是从现在开始设置新的有效期。

要明确的是,结果将使子证书能够值得信赖只有当它本身是有效的 CA 证书时才有效。如果您的“拼写错误”修复是将 BasicConstraints 从 ca:true 更改为 ca:false --不会考虑“拼写错误”——那么结果将与现有的孩子相处得好,但不会证实因为非 CA 证书颁发的子证书无效。

相关内容