
В.Как узнать количество файлов 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())