我已成功使用 Bouncy Castle 中的 X509v3CertificateBuilder Java 类创建具有标准 V3 扩展的 X509 证书。我现在正在尝试使用自定义扩展创建证书。
我可以使用 addExtension(...) 方法创建自定义扩展,但是,证书中的结果值不是我想要的。例如,我希望在自定义 OID 1.2.3.4 下的证书中列出这些确切的八位位组:“00 00 00 00 FF FF FF FF”。我尝试的所有东西都用 ASN1 编码将该八位字节字符串包装起来,并以“04 08 00 00 00 00 FF FF FF FF”结尾。
基本上,我想在 Java 中创建一个具有自定义扩展名的证书,该扩展名看起来与使用具有以下配置的扩展文件使用 OpenSSL 创建证书时的外观相同:
1.2.3.4=DER:00:00:00:00:FF:FF:FF:FF
这可以用 X509v3CertificateBuilder 类以干净的方式完成吗?
下面是创建“不正确”值的代码片段。
// Raw value to place in cert for OID 1.2.3.4.
byte[] bytearray = {0, 0, 0, 0, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF};
ASN1ObjectIdentifier asn1oid = new ASN1ObjectIdentifier("1.2.3.4");
Extension ext = new Extension(asn1oid, false, bytearray);
X509v3CertificateBuilder certBldr =
new JcaX509v3CertificateBuilder(
caCert,
serial,
startDate,
endDate,
dn,
pubKey)
.addExtension(
new ASN1ObjectIdentifier("2.5.29.19"),
false,
new BasicConstraints(false))
.addExtension(
new ASN1ObjectIdentifier("2.5.29.15"),
true,
new X509KeyUsage(
X509KeyUsage.digitalSignature |
X509KeyUsage.nonRepudiation |
X509KeyUsage.keyEncipherment |
X509KeyUsage.dataEncipherment))
.addExtension(
new ASN1ObjectIdentifier("1.2.3.4"),
false,
ext.getExtnValue());
// Create and sign the certificate.
X509CertificateHolder certHolder = certBldr.build(sigGen);
X509Certificate cert = new JcaX509CertificateConverter().setProvider(BC)
.getCertificate(certHolder);