Как извлечь листовые сертификаты из файлов PKCS # 7 - PullRequest
0 голосов
/ 16 мая 2018

Я извлек некоторые сертификаты из исполняемых файлов Windows, закодированных в формате DER, а затем преобразовал их в читаемый формат с помощью этой команды openssl:

# openssl pkcs7 -inform DER -print_certs -text -in cert.der

Выходной файл состоит из нескольких сертификатов. Как я могу отфильтровать все сертификаты, кроме листа одного. Мне не нужны, например, промежуточные или TSA.

Например, это один из извлеченных сертификатов:

[1]: https://pastebin.com/ij2h8i63

1 Ответ

0 голосов
/ 10 ноября 2018

Получив блок PKCS # 7, вы можете получить конечный сертификат с помощью интерфейса openssl C ++, распаковав список сертификатов в цепочке и получив доступ к первому сертификату в индексе 0 (он также может иметь эквивалент в командной строке)

В следующем коде Pkcs7 определен как указатель на структуру PKCS7.

BIO *out = BIO_new(BIO_s_file());
int i = OBJ_obj2nid(Pkcs7->type);
if(i == NID_pkcs7_signed) {
    certs = Pkcs7 ->d.sign->cert;
} else if(i == NID_pkcs7_signedAndEnveloped) {
    certs = Pkcs7->d.signed_and_enveloped->cert;
}


os_log_info(g_logger, "number of ceritifcates = %d", sk_X509_num(certs));
X509 *rootCertX509 = sk_X509_value(certs,sk_X509_num(certs)-1);
X509 *leafCertX509 = sk_X509_value(certs,0);
...