在“纯 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
是“必须是关键的”,等等......如果您遵循这些规则,您的安全性会很好(但您可能必须对互操作性进行一些修改)。