p7s 文件中存在的 crl 证书或 pem 证书的数量

p7s 文件中存在的 crl 证书或 pem 证书的数量

问:我们如何才能找出可以从 P7S 文件生成的 CRL 文件的数量或 PEM 文件的数量?

我理解(这里) P7S 文件中包含的数据不过是 PEM 文件的编码数据(ASN1、DER 格式)。

因此,如果有一个以(ASN1、DER 格式)编码的 P7S 文件,我会使用一些 OpenSSL 命令来获取 ASN1PARSE 数据,从中获取 CRL,最后获取 PEM。

我知道 ASN1PARSE 与 OpenSSL 一起使用时会提供一些文本文件,其中包含一些偏移量、标头长度和长度,通过它们我们可以提取上面提到的 CRL(S) 和 PEM(S)。

现在我的问题是,正如帖子第一行提到的,我如何知道我从 P7S 文件生成了正确数量的文件(crls,pems)?

答案1

PKCS#7 文件,目前定义为加密消息语法(RFC 5652),可以保存许多证书和许多 CRL。

使用 OpenSSL 提取它们的正常方法是使用:

openssl pkcs7 -in file.pem -print_certs -out certs.pem

或者,如果输入文件是 DER:

openssl pkcs7 -inform DER -in file.p7s -print_certs -out certs.pem

man页面指出:

-打印证书
打印出文件中包含的所有证书或 CRL。它们以一行格式显示其主体和颁发者名称。

asn1parse除非您正在调试或自讨苦吃,否则无需对它们进行解析。

以上输出包含所有证书和 CRL 的单个文件。如果您想要单独的文件,您应该能够通过管道传输输出awk,如下所示:

openssl pkcs7 -inform DER -in file.p7s -print_certs | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > "file-" i ".pem" }'

这将为每个对象创建一个文件,文件名为数字。它不区分证书和 CRL。如果需要,您可以修改搜索字符串,使其查找BEGIN CERTIFICATEEND CERTIFICATEBEGIN X509 CRLEND X509 CRL并将"file-"and/or更改".pem"为每种情况下合适的值。


如果您想在 Python 中执行此操作,请使用以下asn1crypto模块:

import os
from asn1crypto import cms

with open( 'file.p7s', 'rb') as f:
    info = cms.ContentInfo.load(f.read())

signed_data = info['content']
certificates = signed_data['certificates']
crls = signed_data['crls']

# Certificate
for certificate in certificates:
    cn = certificate.native['tbs_certificate']['subject']['common_name']
    with open (cn+'.crt', 'wb') as f:
        f.write(certificate.dump())

# Note: I don't have a CMS file with CRLs, so the next section hasn't been tested.    
for crl in crls:
    cn = crl.native['tbs_cert_list']['issuer']['common_name']
    with open (cn+'.crl', 'wb') as f:
        f.write(crl.dump())

相关内容