我从以 DER 格式编码的 Windows 可执行文件中提取了一些证书,然后使用此 openssl 命令将其转换为可读格式:
# openssl pkcs7 -inform DER -print_certs -text -in cert.der
输出文件由多个证书组成。我怎样才能过滤掉除叶子证书之外的所有证书。我不需要例如中间或 TSA 的。
例如,这是提取的证书之一:
一旦获得 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);
假设您在这里偶然发现,因为提取的证书来自 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}'