X.509 证书的哪些属性应该是关键的,哪些不是?

信息安全 证书 公钥基础设施 x.509 限制
2021-08-16 02:19:48

RFC5280 的第 4.2 节规定

证书中的每个扩展都被指定为关键或非关键。如果使用证书的系统遇到它无法识别的关键扩展或包含它无法处理的信息的关键扩展,则必须拒绝证书。一个非关键扩展如果不被识别可以被忽略,但如果它被识别则必须被处理。

但我找不到关于哪些扩展应该(不)被指定为关键的信息(最好是一个简短的列表)我遇到了basicConstraints至关重要的问题,既是因为它是基本的,也是因为标记为的证书CA:FALSE显然不能签署子证书(尽管我认为我在某处读到pathlen了受限制的 CA 似乎偶尔会被忽略) - 但它也是其中之一证书的最基本部分,这可能就是为什么它通常也不被指定为关键部分。keyUsage听起来像是批评的好人选,但是extendedKeyUsageandsubjectAltName呢?

是否有一个简短的概述说明哪些扩展应该是 a) 关键 b) 非关键 c) 无关紧要?

1个回答

在“纯 X.509”中,扩展是否关键并不重要,因为符合要求的实现应该尊重它们识别的扩展,无论它们是否标记为关键。“关键”标志用于非标准的扩展:如果它对安全很重要(理解扩展的实现应该拒绝证书),则将此类扩展设为关键,否则非关键(不理解的实现)然后扩展程序可以安全地忽略它)。

这条规则有一个轻微的例外,有CRL Distribution Points扩展名。它有两个目的:记录可以从哪里下载 CRL,以及实现范围分割仅当扩展至关重要时,后一个角色才有效。当扩展很关键时,只有当 CRL 包含Issuing Distribution Point扩展时,才能认为 CRL 覆盖证书(即能够说明其撤销状态),并且“分发点”与第CRL Distribution Point证书中扩展名。当扩展不重要时,扩展仅用于其文档角色。

在实践中,您是否将扩展设置为关键取决于是否可以忽略它们而不会在整个安全性中造成太大的漏洞,还取决于使扩展关键是否会导致现有实现因缺乏支持而拒绝证书。例如,如果您使用关键Name Constraints扩展,那么您将面临被旧版本 OpenSSL 无条件拒绝的风险(1.0 之前的版本,所有这些都是 EOL,不支持它);但是,如果您将其设为非关键,则相同的 OpenSSL将忽略它Name Constraints扩展是不能安全忽略的扩展的典型案例,因此应始终标记为关键(但互操作性问题使其使用可能存在问题)。

对于每个证书扩展, RFC 5280列出了符合标准的 CA 是否应该使扩展成为关键。这些是对 CA的要求,而不是对验证者的要求;Subject Key Identifier即使 RFC 5280 说(第 4.2.1.2 节),验证证书的系统也不得基于它包含关键扩展而拒绝它:

符合标准的 CA 必须将此扩展标记为非关键。

有关每个扩展的详细信息,请参阅 RFC:这些是您的 CA 应如何行为的指南。例如,Key Usage是“应该是关键的”,Basic Constraints是“可能是关键的”,Name Constraints是“必须是关键的”,等等......如果您遵循这些规则,您的安全性会很好(但您可能必须对互操作性进行一些修改)。