Openssl

p7s 文件中存在的 crl 證書或 pem 證書的數量

  • December 18, 2020

:我們如何找出可以從 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 CERTIFICATEBEGIN X509 CRLEND 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())

引用自:https://serverfault.com/questions/1046486