【问题标题】:Using DEROctetString vs pure Extension使用 DEROctetString 与纯扩展
【发布时间】:2018-11-05 04:51:24
【问题描述】:

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

【问题讨论】:

  • 使用 ASN.1 解析器并打印出差异?

标签: java certificate bouncycastle x509certificate


【解决方案1】:

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

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

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

但是,最近的版本(1.53 以上)包含另一个重载,而不是单独的 OID,布尔值,值采用单个 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())))

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

【讨论】:

    猜你喜欢
    • 2016-06-29
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2013-05-23
    • 2011-08-06
    相关资源
    最近更新 更多