gpt4 book ai didi

java - 使用 DEROctetString 与纯扩展

转载 作者:行者123 更新时间:2023-11-30 06:09:45 25 4
gpt4 key购买 nike

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

最佳答案

TLDR:您的(第一个)方法是正确的

对于背景,实际的extensions X.509 证书(主体= TBSCertificate)中的字段表示/编码每个扩展名 as an OCTET STRING 'wrapping' the DER encoding of the actual value 的值.

但是在 Bouncy 中,当调用 X509v3CertificateBuilder.addExtension 的旧重载时其第三个参数是 ASN1Encodable (值对象)或 byte[] (它的编码)你不需要自己做八位字节字符串; ExtensionsGenerator由构建器内部使用为您完成此操作。事实上,创建 DEROctetString你自己在这里实际上创建了(一个包含的证书)一个值为“双重包装”的扩展——一个包含另一个包含实际值 DER 的 DER 的 OCTET 字符串的 DER 的 OCTET 字符串,这是错误的。

但是,最近的版本(1.53 以上)包含另一个重载,它不是单独的 OID、 boolean 值,而是采用单个 org.bouncycastle.asn1.x509.Extension 值。包含这三个对象的对象 - 创建该对象是不同的:它的构造函数采用编码(并将其包装)或 DEROctetString您自己创建的对象,其构造函数又采用编码或可编码。 (它实际上被声明为父类(super class) 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())))

您确定这不是您在其他地方看到的后两者之一吗?

关于java - 使用 DEROctetString 与纯扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50535113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com