Разобрать цепочку сертификатов SSL PKCS # 7 (.p7b) без закрытого ключа? - PullRequest
4 голосов
/ 18 августа 2011

У меня есть PKCS # 7, подписанный, файл .p7b, который содержит сертификат X509 SSL и сертификаты промежуточного и корневого CA, с которыми он был подписан. Мне нужно использовать C # для анализа файла .p7b, извлечения сертификата SSL и извлечения из него некоторых значений (срок действия, DN и т. Д.).

Я пытался прочитать его как сертификат X509, вот так:

//certContent is a byte array with the p7b file contents
X509Certificate2 cert = new X509Certificate2(certContent);

Это прекрасно работает с обычным сертификатом .cer, но выдает CryptographicException при использовании с сертификатом .p7b. Это потому, что .p7b содержит всю цепочку сертификатов.

Я также попытался проанализировать его как объект SignedCms, затем выполнить итерацию по цепочке сертификатов и извлечь свой сертификат SSL:

SignedCms certContainer = new SignedCms();
certContainer.Decode(certContent);
foreach(X509Certificate2 cert in certConatiner.Certificates)
{
     ...
}

Однако это создает исключение для Decode, говоря ASN1 bad tag value met. После некоторых поисков я считаю, что это потому, что у меня нет личного ключа, который использовался для создания сертификата и / или подписи сертификата.

Кто-нибудь знает, как я могу проанализировать эту цепочку сертификатов .p7b с помощью C #?

1 Ответ

4 голосов
/ 18 августа 2011

Ну, я идиот.Я открыл файл .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);
...