
Q.Wie können wir die Anzahl der CRL-Dateien oder die Anzahl der PEM-Dateien herausfinden, die aus einer P7S-Datei generiert werden können?
Ich verstehe (vonHier) dass die in einer P7S-Datei enthaltenen Daten nichts anderes als die (im ASN1-, DER-Format) codierten Daten der PEM-Datei sind.
Wenn ich also eine P7S-Datei habe, die (im ASN1-, DER-Format) codiert ist, verwende ich einige OpenSSL-Befehle, um ASN1PARSE-Daten zu erhalten, und daraus erhalte ich CRL(s) und schließlich PEM(s).
Ich weiß, dass ASN1PARSE bei Verwendung mit OpenSSL eine Textdatei erzeugt, die einige Offsets, Header-Längen und Längen enthält, mit deren Hilfe wir die oben genannten CRL(S) und PEM(S) extrahieren.
Meine Frage ist nun, wie in der ersten Zeile des Beitrags erwähnt, wie kann ich wissen, dass ich die richtige Anzahl von Dateien (CRLs, PEMs) aus der P7S-Datei generiere?
Antwort1
Eine PKCS#7-Datei, heutzutage definiert inSyntax kryptografischer Nachrichten (RFC 5652), kann viele Zertifikate und viele CRLs enthalten.
Die normale Methode zum Extrahieren mit OpenSSL ist:
openssl pkcs7 -in file.pem -print_certs -out certs.pem
oder, wenn die Eingabedatei DER ist:
openssl pkcs7 -inform DER -in file.p7s -print_certs -out certs.pem
Auf der man
Seite heißt es:
-print_certs
druckt alle in der Datei enthaltenen Zertifikate oder CRLs aus. Vor ihnen stehen der Betreff und der Ausstellername in einer Zeile.
Es besteht keine Notwendigkeit, sie zu analysieren, asn1parse
es sei denn, Sie führen eine Fehlerbehebung durch oder sind ein Masochist.
Oben wird eine einzelne Datei ausgegeben, die alle Zertifikate und CRLs enthält. Wenn Sie einzelne Dateien möchten, sollten Sie die Ausgabe durch eine Pipe leiten können awk
, etwa mit:
openssl pkcs7 -inform DER -in file.p7s -print_certs | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > "file-" i ".pem" }'
Dadurch wird für jedes Objekt einfach eine Datei mit einem numerischen Dateinamen erstellt. Dabei wird nicht zwischen Zertifikaten und CRLs unterschieden. Wenn Sie das benötigen, können Sie die Suchzeichenfolge so ändern, dass nach BEGIN CERTIFICATE
, END CERTIFICATE
oder gesucht wird BEGIN X509 CRL
, END X509 CRL
und das "file-"
und/oder ".pem"
in jedem Fall durch etwas Passendes ersetzen.
Wenn Sie dies in Python tun möchten, verwenden Sie das asn1crypto
Modul:
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())