如何将BouncyCastle的X509证书转换为X509Certificate2?

11
有没有办法将Org.BouncyCastle.X509.X509Certificate转换为System.Security.Cryptography.X509Certificates.X509Certificate2
反向操作很容易,只需将Org.BouncyCastle.X509.X509CertificateParserSystem.Security.Cryptography.X509Certificates.X509Certificate2.Export()结合即可。
4个回答

14

简单!!

using B = Org.BouncyCastle.X509; //Bouncy certificates
using W = System.Security.Cryptography.X509Certificates;

W.X509Certificate2 certificate = new W.X509Certificate2(pdfCertificate.GetEncoded());

现在我可以验证服务器中的证书链:

W.X509Chain ch = new W.X509Chain();
ch.ChainPolicy.RevocationMode = W.X509RevocationMode.NoCheck;
if (!ch.Build(certificate))
   res |= ErroresValidacion.CAInvalida; 

用来验证使用 iTextSharp 提取的 PDF 证书。


4
在某些平台上这不起作用 - 您需要使用 new W.X509Certificate2(pdfCertificate.GetEncoded()); - Michael Brown

2

来自https://github.com/dotnet/corefx/wiki/ApiCompat

X509Certificate和X509Certificate2对象的大多数用户都认为该对象是不可变的,除了Reset()/Dispose()方法外,使用Import会违反这一假设。

换句话说,在.NET Core中尝试使用Import会引发异常。现在应该使用:

new X509Certificate(cert.GetEncoded());

但是,根据 .NET API 分析器 (https://learn.microsoft.com/en-us/dotnet/standard/analyzers/api-analyzer) 的说法,

警告 PC001: X509Certificate2.X509Certificate2(byte[]) 在 macOS 上不受支持。


0
最简单的方法是:
var x509Certificate = Org.BouncyCastle.Security.DotNetUtilities.ToX509Certificate(bouncyCert);
var x509Certificate2 = new X509Certificate2(x509Certificate);

感谢您为Stack Overflow社区做出的贡献。这可能是一个正确的答案,但如果您能提供代码的额外解释,让开发者能够理解您的思路,那将非常有帮助。对于那些对语法不太熟悉或者难以理解概念的新手开发者来说,这尤其有用。您是否可以友好地编辑您的答案,以便为社区的利益提供更多细节? - undefined

-2

我想那应该是最好的答案:

var cert = pdf.Certificates[0];//Org.BouncyCastle.X509.X509Certificate
        var cert50 = new X509Certificate();
        cert50.Import(cert.GetEncoded());

这很奇怪... OP 要求将其转换为 "X509Certificate2",但您却将其转换为 "X509Certificate"。纠正一下,剩下的就是 kaptux 的已接受答案中已经提到的内容了。 - mkl
这并没有回答问题,因为它转换为 X509Certificate 而不是 X509Certificate2 对象。与被接受的答案相比,它也没有添加任何新的逻辑。 - Kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接