número de certificados crl ou certificados pem presentes no arquivo p7s

número de certificados crl ou certificados pem presentes no arquivo p7s

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 manpá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, asn1parsea 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 CERTIFICATEou BEGIN X509 CRL, END X509 CRLe altere "file-"e/ou ".pem"para algo apropriado em cada caso.


Se você quiser fazer isso em Python, use o asn1cryptomó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())

informação relacionada