如何检查X509Certificate是否为CA证书?

我在Java中有一个X509Certificate实例,我需要确定它是CA证书还是用户证书。

有人可以提供任何帮助吗?

提前致谢!

根据我所做的研究,可以通过检查基本约束来检查! 检查API以返回getBasicConstraints()方法的结果。

因此,如果方法返回结果!= -1 ,则可以将证书视为CA certificate

我已经使用多个CA certificates (根CA certificates和中间CA certificates )对此进行了检查,它的工作原理如上所述。 我还使用多个用户证书检查了此方法,并且该方法返回-1作为结果。

X509Certificate.getKeyUsage()javadoc:

获取一个表示KeyUsage扩展位的布尔数组(OID = 2.5.29.15)。 密钥用法扩展定义了证书中包含的密钥的目的(例如,加密,签名,证书签名)。 ASN.1的定义是:

  KeyUsage ::= BIT STRING { digitalSignature (0), nonRepudiation (1), keyEncipherment (2), dataEncipherment (3), keyAgreement (4), keyCertSign (5), --> true ONLY for CAs cRLSign (6), encipherOnly (7), decipherOnly (8) } 

证书可以检查如下:

 X509Certificate cert = ...; boolean[] keyUsage = cert.getKeyUsage(); if ( keyUsage[5] ) { // CA certificate } else { // User certificate } 

根CA将是启用了keyCertSign标志的自签名证书。 在大多数情况下,为方便起见,通用名称可包括单词CA 中间CA证书可以由Root CA (或其他中间人!)签名。 您的浏览器密钥库将包含通常受信任的CA证书的示例。

来自互联网工程任务组

 The keyCertSign bit is asserted when the subject public key is used for verifying a signature on certificates. This bit may only be asserted in CA certificates.