我正在延长私有 CA 的有效期,并创建具有相同名称、序列号、私钥/公钥等的新证书。唯一的变化是“开始日期”和“结束日期”。
检查证书链验证,使用新 CA 和 OpenSSL 成功验证了旧的 X.509 证书。太棒了。
但我想知道...新的“等效” CA 的开始日期是否比我正在验证的 X.509 证书的“开始日期”更现代。这意味着 CA 在签署 X.509 证书时无效。
OpenSSL 验证证书链中的所有证书“现在”是否有效,但它不会检查证书链中签名之间的“因果关系”。
对于 OpenSSL 来说这是没问题的,但我想知道是否会发现其他 X.509 库存在问题。
检查 RFC 5280 我发现链验证非常复杂而且并不简单,但唯一的时间参考是这样的:
6.1.3. Basic Certificate Processing
...
(2) The certificate validity period includes the current time.
...
也就是说,链中的所有证书“现在”都必须有效,但是证书签名之间的因果关系根本没有描述。
所以...
当处理其他非“OpenSSL”实现时,我所做的事情是否安全?
答案1
当您拥有多个具有相同主题和公钥但时间不同的 CA 证书时,这种情况并不罕见。以下是来自互联网的一张显示这种情况的图片:
如果验证函数可以访问两个(或多个)CA 证书,它将构建一个单独的链以匹配颁发者并单独验证每个证书。如果我们查看图像,则会构建以下链:
- 服务器证书 -> LE 授权 X3 -> ISRG Root X1
- 服务器证书 -> LE 授权机构 X3 -> IdentTrust DST Root CA X3
您的场景与中间证书非常相似LE Authority X3
。当所有链都已构建并验证后,验证引擎会根据某些标准执行“最佳”链选择。在您的案例中,一段时间内,一条链将有效,而第二条链将无效,因此最佳链选择很容易:验证函数将使用有效链并丢弃无效链。
如果验证函数生成了多个有效链,则该函数会应用额外的逻辑(或权重)以在多个有效链中选择“最佳”链。也就是说,如果验证函数可以访问有效和尚未有效的发行者,那么您不应该遇到任何问题,因为验证函数将向调用者返回具有有效发行者的链。
更新:我似乎没有清楚地理解有关的问题:
Is out there any problem if a CA "not before" is later that the "not before" of a certificate it signed?
视情况而定。如果当前(验证)时间在证书的有效期内,则认为该证书有效。假设您将 CA 有效期设置为 到 ,Apr 1, 2024
并且Apr 1, 2025
签名证书的有效期为Mar 19, 2024
到Jun 1, 2024
,则验证结果将取决于您运行此验证的时间。
- 您对 执行验证
Mar 20, 2024
。当前时间在叶证书的有效期内。叶证书没有问题。当前时间超出颁发者的有效期。并非所有证书都处于有效期内,链不符合时间要求,证书验证功能应会失败。 - 您对 执行验证
Apr 2, 2024
。当前时间在叶证书的有效期内。叶证书没有问题。当前时间在颁发者的有效期内。颁发者没有问题。所有证书均在有效期内,整个链都有效,验证功能可以在必要时继续进行其他检查。
也就是说,根本不检查追溯证书的时间有效性。重要的是——在验证时间点,所有证书是否都在其有效期内。过去的情况——没人关心。
再次重申:当叶证书NotBefore
早于发行者证书NotBefore
或NotAfter
晚于发行者证书时,这是有效的场景NotAfter
。叶证书仅包含匹配发行者证书的引用,例如公钥哈希(通过 SKI 扩展)和发行者字段。没有人会阻止您拥有具有相同公钥(和哈希)和主题字段的多个证书。当您使用相同的密钥对续订 CA 证书时,这种情况总是会发生。在续订期间,只有序列号和有效期会更改。发行者的公钥和主题不会更改。