如何在使用 bouncycastle 签名之前添加 ASN.1 扩展?

Posted

技术标签:

【中文标题】如何在使用 bouncycastle 签名之前添加 ASN.1 扩展?【英文标题】:How to add ASN.1 extensions before signing with bouncycastle? 【发布时间】:2021-12-26 19:46:45 【问题描述】:

是的,所以我完全被难住了。通常,当我签署证书时,我会使用如下所示的 ASN.1 来指定特定规则,例如可用于 IoT。

1.2.3.4=ASN1:SEQUENCE:seq_sect

[seq_sect]
one=SEQUENCE:do_one
two=SEQUENCE:do_two

[do_one]
field.1 = UTF8:field1/*
field.2 = UTF8:field2/*

[do_two]
field.1 = UTF8:field1/*
field.2 = UTF8:field2/*

我通常使用一个名为 xca 的程序,但在这种情况下,我一直在使用 bouncycastle 进行编码,并且一直在努力将其导入 X509v3CertificateBuilder。我知道我应该使用 .addExtension,但我不确定是否应该将规则存储在 .txt 文件中,或者是否应该将其存储在数组中并以某种方式解析它?

【问题讨论】:

【参考方案1】:

实际上,您使用的是 xca 包装的 OpenSSL。只有 OpenSSL 对 ASN.1 使用这种特殊的基于文本的“配置”格式。对于 BouncyCastle,您将不得不编写代码,例如(未测试):

ASN1EncodableVector one = new ASN1EncodableVector();
one.add(new DERUTF8String("field1/*"));
one.add(new DERUTF8String("field2/*"));

// if two is really identical to one, just reuse it; otherwise do something different

ASN1EncodableVector outer = new ASN1EncodableVector();
outer.add(new DERSequence(one));
outer.add(new DERSequence(two)); // or one again

builder.addExtension (oid, critical, new DERSequence(outer));

类似How to add PrivateKeyUsage extension to a certificate using bouncycastle in java? 和Creating Custom X509 v3 Extensions in Java with Bouncy Castle

【讨论】:

以上是关于如何在使用 bouncycastle 签名之前添加 ASN.1 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

使用 mbedtls 生成的 RSA 签名,无法使用 C# (bouncycastle) 应用程序进行验证

ECDSA 使用 BouncyCastle 签名并使用 Crypto++ 进行验证

BouncyCastle ECDSA 签名验证使用 prime256v1 和 SHA256withECDSA 算法失败

c#中的数字签名而不使用BouncyCastle

使用BouncyCastle Java API进行PGP签名并使用gpg4win进行验证不起作用

将消息和签名转换为 BouncyCastle CMSSignedData 对象