我正在使用充气城堡图书馆为我的X509V3Certificate证书添加扩展名。请说我想在我的证书中添加 ExtendedKeyUsage 扩展名。我正在使用X509V3CertificateBuilder类和addExtension()方法所以我这样做此
X509V3CertificateBuilder cf=...;
ExtendedKeyUsage eku = new ExtendedKeyUsage(KeyPurposeId.anyExtendedKeyUsage);
cf.addExtension(Extension.ExtendedKeyUsage, false , eku);
但我在整个网络上的一些例子中看到的是,人们正在做下一件事
cf.addExtension(Extension.ExtendedKeyUsage, false, new DEROctetString(eku));
当我使用第一种方法(没有DEROctetString)时,我没有得到编译器的任何警告但是我不知道有什么区别,哪种方式更好,它们都是正确的吗?
答案 0 :(得分:1)
TLDR:你的(第一个)方法是正确的
对于后台,X.509证书中((正文= extensions
)的实际TBSCertificate
字段表示/编码每个扩展名as an OCTET STRING 'wrapping' the DER encoding of the actual value的值。
但是在Bouncy调用X509v3CertificateBuilder.addExtension
的旧重载时,其第三个参数是ASN1Encodable
(值对象)或byte[]
(其编码),你不需要这样做OCTET STRING你自己;构建器内部使用的ExtensionsGenerator
为您完成。事实上,在这里自己创建DEROctetString
实际上创建(包含一个证书)一个扩展,其值为'double wrapped' - 一个OCTET STRING包含另一个OCTET STRING的DER包含实际值的DER,这是错误的
但是,最近的版本(1.53 up)包含另一个重载,而不是单独的OID,boolean,value需要一个包含这三个的org.bouncycastle.asn1.x509.Extension
对象 - 并且创建该对象是不同的:它的构造函数采用编码(并包装它)或您自己创建的DEROctetString
对象,其构造函数依次采用编码或编码。 (它实际上被声明为超类ASN1OctetString
但你想使用DER
子类,因为证书体必须完全是DER。)因此(任何)以下也是正确的:
certbuilder.addExtension(new Extension(Extension.extendedKeyUsage, false, eku.getEncoded()))
certbuilder.addExtension(new Extension(Extension.extendedKeyUsage, false, new DEROctetString(eku)))
certbuilder.addExtension(new Extension(Extension.extendedKeyUsage, false, new DEROctetString(eku.getEncoded())))
你确定它不是你在别处看到的后两者之一吗?