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」になります。
基本的に、この構成を持つ拡張ファイルを使用して OpenSSL で作成されたときに証明書がどのように見えるかと同じように見えるカスタム拡張を使用して、Java で証明書を作成したいと思います。
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);