количество сертификатов crl или pem, присутствующих в файле p7s

количество сертификатов crl или pem, присутствующих в файле p7s

В.Как узнать количество файлов CRL или количество файлов PEM, которые можно сгенерировать из файла P7S?

Я понимаю (изздесь) что данные, содержащиеся в файле P7S, представляют собой не что иное, как закодированные (в формате ASN1, DER) данные файла PEM.

Итак, если у меня есть файл P7S, закодированный в формате ASN1, DER, я использую некоторые команды OpenSSL для получения данных ASN1PARSE, из которых я получаю CRL и, наконец, PEM.

Я знаю, что ASN1PARSE при использовании с OpenSSL выдает некий текстовый файл, содержащий некоторые смещения, длины заголовков и длины, с помощью которых мы извлекаем вышеупомянутые CRL(S) и PEM(S).

Теперь мой вопрос, как уже упоминалось в первой строке поста, как я могу узнать, что я генерирую правильное количество файлов (crls, pems) из файла P7S?

решение1

Файл PKCS#7, в настоящее время определенный вСинтаксис криптографического сообщения (RFC 5652), может содержать множество сертификатов и множество списков отзыва сертификатов.

Обычный способ извлечения с помощью 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или 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())

Связанный контент