![p7s 文件中存在的 crl 证书或 pem 证书的数量](https://linux22.com/image/761178/p7s%20%E6%96%87%E4%BB%B6%E4%B8%AD%E5%AD%98%E5%9C%A8%E7%9A%84%20crl%20%E8%AF%81%E4%B9%A6%E6%88%96%20pem%20%E8%AF%81%E4%B9%A6%E7%9A%84%E6%95%B0%E9%87%8F.png)
问:我们如何才能找出可以从 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 CERTIFICATE
、END CERTIFICATE
或BEGIN X509 CRL
,END 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())