如何从PKCS#7文件中提取叶证书

时间:2018-05-16 20:13:06

标签: openssl certificate code-signing

我从以DER格式编码的Windows可执行文件中提取了一些证书,然后使用此openssl命令将其转换为可读格式:

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

输出文件包含多个证书。如何过滤掉除叶子之外的所有证书。我不需要例如中间或TSA。

例如,这是提取的证书之一:

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

1 个答案:

答案 0 :(得分:1)

一旦获得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);