无需私钥即可解析 PKCS #7 SSL 证书链 (.p7b)?

Pet*_*y B 5 c# security ssl certificate pkcs#7

我有一个 PKCS #7、已签名的 .p7b 文件,其中包含 X509 SSL 证书以及用于签名的中间 CA 证书和根 CA 证书。我需要使用 C# 解析 .p7b 文件,提取 SSL 证书,并从中提取一些值(到期日期、DN 等)。

我尝试将其作为 X509 证书读取,如下所示:

//certContent is a byte array with the p7b file contents
X509Certificate2 cert = new X509Certificate2(certContent);
Run Code Online (Sandbox Code Playgroud)

这对于常规 .cer 证书可以正常工作,但CryptographicException在与 .p7b 证书一起使用时会抛出异常。这是因为 .p7b 包含整个证书链。

我还尝试将其解析为SignedCms对象,然后迭代证书链并提取我的 SSL 证书:

SignedCms certContainer = new SignedCms();
certContainer.Decode(certContent);
foreach(X509Certificate2 cert in certConatiner.Certificates)
{
     ...
}
Run Code Online (Sandbox Code Playgroud)

Decode然而,这会引发一个异常ASN1 bad tag value met。经过一番搜索,我相信这是因为我没有用于创建证书和/或签署证书的私钥。

有谁知道如何使用 C# 解析这个 .p7b 证书链?

Pet*_*y B 6

好吧,我是个白痴。我打开 .p7b 文件,发现它的内部只是 base64。我取出 Base64,对其进行解码,然后将其解析为签名的 CMS,一切顺利。

String content = Encoding.UTF8.GetString(certContent);
String base64Content = content.Replace("-----BEGIN CERTIFICATE-----", "").Replace("-----END CERTIFICATE-----", "").Replace("\r", "").Replace("\n", "");
byte[] decodedContent = Convert.FromBase64String(base64Content);
SignedCms certContainer = new SignedCms();
certContainer.Decode(decodedContent);
Run Code Online (Sandbox Code Playgroud)