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 CERTIFICATE, END CERTIFICATEor BEGIN 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())

相關內容