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

How to get BasicConstraints extension from Java X509 certificate

我想从 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() 方法,其中 returns 和 int。问题是当扩展名不存在时它也会 returns -1

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

BasicConstraints 扩展的有效编码(在 OCTET STRING 中)是:

  1. CA=假: 30 00

  2. CA=true,路径省略: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 种情况。