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)?
現在在Cryptographic Message Syntax (RFC 5652)中定義的 PKCS#7 文件可以保存許多證書和許多 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
頁面指出:-print_certs
列印出文件中包含的任何證書或 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-"
和/或更改".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())