Anzahl der in der P7S-Datei vorhandenen CRL-Zertifikate oder PEM-Zertifikate

Anzahl der in der P7S-Datei vorhandenen CRL-Zertifikate oder PEM-Zertifikate

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 manSeite 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, asn1parsees 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 CERTIFICATEoder gesucht wird BEGIN X509 CRL, END X509 CRLund das "file-"und/oder ".pem"in jedem Fall durch etwas Passendes ersetzen.


Wenn Sie dies in Python tun möchten, verwenden Sie das asn1cryptoModul:

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())

verwandte Informationen