Security x.509 V3扩展的基本约束和创建CA证书的密钥使用之间有什么区别?

Security x.509 V3扩展的基本约束和创建CA证书的密钥使用之间有什么区别?,security,encryption,ssl,cryptography,x509certificate,Security,Encryption,Ssl,Cryptography,X509certificate,这两个动作似乎是一样的: 在X.509证书中使用基本约束扩展来表示它是CA证书,并且 使用密钥使用扩展名,例如,表示公钥可用于证书签名 这些扩展之间有什么区别? 它们的用途相同还是相互补充?密钥用法描述了证书的预期用途 基本约束扩展描述了将证书作为其顶部的证书链的深度。换句话说,CA使用此扩展在颁发子CA证书时限制其子CA的活动。如果顶级CA获得子CA,它允许子CA颁发最终用户证书,但不允许子CA拥有自己的子CA “密钥使用”定义如何使用证书中包含的密钥。使用的示例有:加密、签名、签名证书、

这两个动作似乎是一样的:

  • 在X.509证书中使用基本约束扩展来表示它是CA证书,并且
  • 使用密钥使用扩展名,例如,表示公钥可用于证书签名
这些扩展之间有什么区别?

它们的用途相同还是相互补充?

密钥用法描述了证书的预期用途

基本约束扩展描述了将证书作为其顶部的证书链的深度。换句话说,CA使用此扩展在颁发子CA证书时限制其子CA的活动。如果顶级CA获得子CA,它允许子CA颁发最终用户证书,但不允许子CA拥有自己的子CA

“密钥使用”定义如何使用证书中包含的密钥。使用的示例有:加密、签名、签名证书、签名CRL

“基本约束”标识证书的主体是否是允许颁发子证书的CA。


对于可用于签署证书的证书,信息在某种意义上是重复的:

  • X509v3基本约束:CA:TRUE---可以签署证书
  • X509v3密钥用法:密钥证书签名---可以签名证书
但“基本约束”还将指定有效认证链的最大深度

尽管它是重复的,但根据需要,您需要同时指定这两者。 这是RFC的相关段落(第29页):

当主题公钥为 用于验证公钥证书上的签名。如果 先声明keyCertSign位,然后声明basic中的cA位 还必须声明扩展约束(第4.2.1.10节)


@Eugene:我们是否可以拥有一个具有密钥使用扩展名的证书,它可以签署证书,但缺少基本约束?这与具有基本约束的证书是具有infinte证书路径的CA相同吗?@user384706,来自RFC 5280,第4.2.1.9节:“合格CA必须将此扩展包含在所有CA证书中,这些证书包含用于验证证书上数字签名的公钥,并且必须将扩展标记为此类证书中的关键部分。”因此,您的问题的答案似乎是“这将违反标准”“。但是,我确实看到了没有此类扩展的证书。@Eugene:Java的PKIX API(使用Java6u23进行检查)只接受具有密钥使用(而不是基本约束)的CA证书。这是否意味着java违反了RFC?@user384706我是谁来判断它们的?我引用了RFC,它说扩展必须存在。但是,不接受这样的证书会导致兼容性问题,所以我猜Java创建者会接受不兼容的证书(至少在默认情况下)。@Eugene:兼容性问题?在什么之间?兼容和不兼容实现之间?“信息在某种意义上是重复的”您知道实现是否进行验证,在进行证书路径验证时,接受基本约束或密钥用法以表示CA?@user384706:不,您需要两者。我已经用这些信息更新了我的答案。还有一些证书可能是由非CA证书颁发的:看你的问题解决了吗?那么请接受最好的答案。否则,请说明此处仍然缺少的内容。