我已成功使用Bouncy Castle的X509v3CertificateBuilder Java類創建具有標準V3擴展的X509證書。我正在嘗試使用自定義擴展名創建證書。使用Bouncy Castle在Java中創建自定義X509 v3擴展
我可以使用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錯誤。鑑於它是開源的,「源代碼是最好的文檔」,您可以查看提示的源代碼。 – 2013-05-07 06:29:05
謝謝尤金!我能夠查看源代碼並使用其他方法來完成所需的任務。 – gtrig 2013-05-10 20:43:24