我在Java中有一个X509Certificate实例,需要确定它是CA证书还是用户证书。
有人可以提供帮助吗?
先谢谢了!
我在Java中有一个X509Certificate实例,需要确定它是CA证书还是用户证书。
有人可以提供帮助吗?
先谢谢了!
根据我进行的研究,可以通过检查基本约束来进行检查!请查看API以返回getBasicConstraints()
方法的结果。
因此,如果该方法返回结果不等于-1,则可以将证书视为CA证书
。
我已经使用几个CA证书
(根和中间)进行了检查,结果与描述相符。我还使用几个用户证书进行了此方法的检查,该方法返回结果为-1。
!= -1
。 - JFreemangetBasicConstraints()!= -1
,然后是certificate.getKeyUsage()[5] == true
。我阅读Oracle文档时认为这是可能的,并且到目前为止我没有发现这种方法的错误。这里是文档链接X509Certificate Java6。Java 7对此功能没有引入更改。 - JFreeman!certificate.getKeyUsage()[5]
。参考@dpinya的答案。 - JFreemanX509Certificate.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 }
keyUsage
数组是否为空,因为如果此证书不包含KeyUsage扩展,则返回null。
- sedovav根证书(Root 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.