我想从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
标志的方法。
答案 0 :(得分:2)
BasicConstraints扩展名(在OCTET STRING内)的有效编码为:
CA = false:30 00
CA = true,省略pathlen:30 03 01 01 FF
CA = true,pathlen = 0到127:30 06 01 01 FF 02 01 xx
CA = true,pathlen> = 128:使用这么长的路径太愚蠢了,我忽略了这种情况,但是如果您确实想要的话,可以使用DER规则来解决
您最有可能遇到案例1。