使用DEROctetString与纯扩展

时间:2018-05-25 18:38:57

标签: java certificate bouncycastle x509certificate

我正在使用充气城堡图书馆为我的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)时,我没有得到编译器的任何警告但是我不知道有什么区别,哪种方式更好,它们都是正确的吗?

1 个答案:

答案 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())))

你确定它不是你在别处看到的后两者之一吗?