
問。我們怎麼知道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
or 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())