18

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

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

提前致谢!

4

3 回答 3

18

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

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

我已经用几个CA certificates(根和中间)检查了这个,它按描述工作。我还使用多个用户证书检查了此方法,该方法返回 -1 作为结果。

于 2012-08-27T13:12:11.480 回答
13

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
}
于 2015-02-12T17:40:28.010 回答
2

根 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.
于 2012-08-23T13:24:06.263 回答