我从我使用的服务中获取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文件中。有没有办法将证书添加到容器中的链?
答案 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();