如何从Java X509证书获取BasicConstraints扩展

时间:2019-12-20 22:55:00

标签: java bouncycastle x509

我想从Java X509Certificate读取扩展BasicConstraints(证书实现来自默认的JCE,所以它是sun.security.x509.X509CertImpl)。

我想获取BasicConstraint扩展值以检查它是否为CA:

X509Certificate certificate = ...
byte[] basicConstraint = certificate.getExtensionValue("2.5.29.19");

但是这给了我包含DEROctetString的字节数组。展开后,我得到2个字节的字节数组。 但是扩展名BasicConstraint似乎定义为:

BasicConstraints := SEQUENCE {
    cA                  BOOLEAN DEFAULT FALSE,
    pathLenConstraint   INTEGER (0..MAX) OPTIONAL
}

我已经看过X509Certificate::getBasicConstraints()方法,该方法返回一个int。问题在于,当扩展名不存在时,它还会返回-1

这就是为什么我正在寻找一种从X509证书中获取此ASN1序列以显式检查此CA boolean标志的方法。

1 个答案:

答案 0 :(得分:2)

BasicConstraints扩展名(在OCTET STRING内)的有效编码为:

  1. CA = false:30 00

  2. CA = true,省略pathlen:30 03 01 01 FF

  3. CA = true,pathlen = 0到127:30 06 01 01 FF 02 01 xx

  4. CA = true,pathlen> = 128:使用这么长的路径太愚蠢了,我忽略了这种情况,但是如果您确实想要的话,可以使用DER规则来解决

您最有可能遇到案例1。