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

问题描述 投票:0回答:2

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

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

输出文件由多个证书组成。我怎样才能过滤掉除叶子证书之外的所有证书。我不需要例如中间或 TSA 的。

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

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

openssl certificate code-signing
2个回答
0
投票

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

0
投票

假设您在这里偶然发现,因为提取的证书来自 PDF(可能来自 PE,如您的情况)(https://superuser.com/questions/1242743/inspecting-digital-signature-in-pdf-file ) ,然后一个漂亮的小 awk oneliner 可以将单独的证书写入单独的文件中。现在,一一检查它们以进行您想要的过滤应该更容易

pdfsig somepdf.pdf -dump
openssl pkcs7 -inform der -text  -print_certs -in somepdf.sig0 | awk 'BEGIN {i=0} /Subject:/ {i+=1;d=sprintf("cert-%d.pem",i);} /----BEGIN/,/END CERTIFICATE-----/ {print $0 >> d}'
© www.soinside.com 2019 - 2024. All rights reserved.