
Q.Como podemos descobrir o número de arquivos CRL ou o número de arquivos PEM que podem ser gerados a partir de um arquivo P7S?
eu entendo (deaqui) que os dados contidos em um arquivo P7S nada mais são do que os dados codificados (no formato ASN1, DER) do arquivo PEM.
Então, se tiver um arquivo P7S codificado em (no formato ASN1, DER), eu uso alguns comandos OpenSSL para obter dados ASN1PARSE e dos quais obtenho CRL(s) e finalmente obtenho PEM(s).
Eu sei que ASN1PARSE, quando usado com OpenSSL, fornece algum arquivo de texto que contém alguns deslocamentos, comprimentos e comprimentos de cabeçalho, com os quais extraímos os CRL(S) e PEM(S) mencionados acima.
Agora minha pergunta é, conforme mencionado na primeira linha do post, como posso saber se estou gerando o número certo de arquivos (crls, pems) do arquivo P7S?
Responder1
Um arquivo PKCS#7, hoje definido emSintaxe de mensagem criptográfica (RFC 5652), pode conter muitos certificados e muitas CRLs.
A maneira normal de extraí-los com OpenSSL é usar:
openssl pkcs7 -in file.pem -print_certs -out certs.pem
ou, se o arquivo de entrada for DER:
openssl pkcs7 -inform DER -in file.p7s -print_certs -out certs.pem
A man
página afirma:
-print_certs
imprime quaisquer certificados ou CRLs contidos no arquivo. Eles são precedidos pelos nomes do assunto e do emissor em formato de uma linha.
Não há necessidade de analisá-los, asn1parse
a menos que você esteja depurando ou seja um glutão de punição.
O texto acima gera um único arquivo contendo todos os certificados e CRLs. Se você quiser arquivos individuais, poderá canalizar a saída awk
, com algo semelhante a:
openssl pkcs7 -inform DER -in file.p7s -print_certs | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > "file-" i ".pem" }'
Isso simplesmente criará um arquivo para cada objeto com um nome de arquivo numérico. Não diferencia entre certificados e CRLs. Se precisar disso, você pode modificar a string de pesquisa para que ela procure BEGIN CERTIFICATE
, END CERTIFICATE
ou BEGIN X509 CRL
, END X509 CRL
e altere "file-"
e/ou ".pem"
para algo apropriado em cada caso.
Se você quiser fazer isso em Python, use o asn1crypto
módulo:
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())