在C#中将证书链添加到PKCS#7 / CMS容器

时间:2014-02-05 09:12:53

标签: c# x509certificate x509 pkcs#7

我从我使用的服务中获取PKCS#7 / CMS容器,其中包括用户证书和签名。

我可以使用SignedCms

查看单个证书
var cert = GetCertFromServer();

SignedCms signedCms = new SignedCms();
signedCms.Decode(cert);

// The user certificate
X509Certificate2 userCert = signedCms.Certificates[0];  

但我需要将中间证书和根证书添加到该链中。 SignedCms.Certificates似乎是不可变的,因此我无法将证书直接添加到集合中,而且我无法通过以下方式替换证书集合

// root, inter and leaf certs are X509Certificate2 objects read from files
X509Certificate2[] certArr = new[] {rootCert, interCert, leafCert, userCert};

X509Certificate2Collection chain = new X509Certificate2Collection(certArr);

signedCms.Certificates = chain; // Error: No setter

由于SignedCms.Certificates没有设定者。我还没有找到一种方法来创建一个新容器。我也没有运气如何在充气城堡或任何其他图书馆找到这方面的信息。

我需要一个包含证书链和签名的容器,并将该容器中的字节写入我正在签名的PDF文件中。有没有办法将证书添加到容器中的链?

2 个答案:

答案 0 :(得分:0)

我知道问这个问题已经有好几年了,但是我最近遇到了同样的问题。

对于遇到相同问题的任何人,X509Certificate2Collection类都具有Export方法。

X509Certificate2[] certArr = certificates.ToArray();
X509Certificate2Collection chain = new X509Certificate2Collection(certArr);
byte[] result = chain.Export(X509ContentType.Pkcs7);

答案 1 :(得分:0)

.NET Core 3.0已添加SignedCms.AddCertificate。您无法控制顺序(SignedCms.Encode()使用DER编码规则写入数据,该规则指示此特定集合首先被最小排序),但是没关系... X509Chain可以将其弄清楚。

SignedCms signedCms = new SignedCms();
signedCms.Decode(data);

signedCms.AddCertificate(leafCert);
signedCms.AddCertificate(interCert);
signedCms.AddCertificate(rootCert);

byte[] reencoded = signedCms.Encode();