Bouncycastle:X509CertificateHolder 到 X509Certificate?

Posted

技术标签:

【中文标题】Bouncycastle:X509CertificateHolder 到 X509Certificate?【英文标题】:Bouncycastle: X509CertificateHolder to X509Certificate? 【发布时间】:2011-09-16 06:08:05 【问题描述】:

在 r146 之前的版本中,可以直接创建 X509Certificate 对象。 现在该 API 已被弃用,新的​​ API 仅提供 X509CertificateHolder 对象。

我找不到将X509CertificateHolder 转换为X509Certificate 的方法。

如何做到这一点?

【问题讨论】:

您有在线 API 文档的链接吗? 谢谢你,史蒂芬。这很有帮助。 @SteffenHeil,您应该将答案放在答案部分,以便我们将其标记为已回答。 【参考方案1】:

这是一种将X509CertificateHolder 转换为X509CertificatetoString 的可能性。 (代码第一句无关)

X509CertificateHolder selfSignedCertificate = CertificateUtils.selfSignCertificate(certificationRequest, keyPair.getPrivate());
byte[] content = selfSignedCertificate.getEncoded();
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(new ByteArrayInputStream(content));
logger.debug("cert: ", cert.toString());

........

【讨论】:

你应该添加一些解释。【参考方案2】:

另一个选项是这个:)

CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
InputStream in = new ByteArrayInputStream(certificateHolder.getEncoded());
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(in);

【讨论】:

太冗长了,@SteffenHeil 的回答似乎是最“标准”的方法。【参考方案3】:

我会回答我自己的问题,但不会删除它,以防其他人遇到同样的问题:

return new JcaX509CertificateConverter().setProvider( "BC" )
  .getCertificate( certificateHolder );

对于属性证书:

return new X509V2AttributeCertificate( attributeCertificateHolder.getEncoded() );

不是很好,因为它是编码和解码,但它可以工作。

【讨论】:

优秀的参考。谢谢。 X509V2AttributeCertificate 现在已弃用。我不确定要使用什么或如何解析。 X509AttrCertParser 未弃用,但 engineRead() 返回一个已弃用的 X509V2AttributeCertificate。 我认为您应该删除 .setProvider( "BC" ) 方法调用,因为它不是严格要求的。

以上是关于Bouncycastle:X509CertificateHolder 到 X509Certificate?的主要内容,如果未能解决你的问题,请参考以下文章

BouncyCastle 未定义长度 ASN1

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

使用充气桥X509v3CertificateBuilder生成X509证书

是否可以仅使用 C# 以编程方式生成 X509 证书?

在 Java 中生成 X509Certificate 的主题哈希

C# 如何验证 Root-CA-Cert 证书 (x509) 链?