【发布时间】:2013-05-07 06:10:42
【问题描述】:
我已成功使用 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);
【问题讨论】:
-
那些额外的字节字节(04 08)是ASN.1编码的标签类型和标签长度。看起来您的 BouncyCastle 没有在需要时剥离它们(在调用 ext.getExtnValue() 时),或者您使用错误的 BouncyCastle。鉴于它是开源的并且“源代码是最好的文档”,您可以查看源代码以获取提示。
-
谢谢尤金!我能够查看源代码并使用其他方法来完成所需的工作。
标签: java openssl certificate x509certificate bouncycastle