número de certificados crl o certificados pem presentes en el archivo p7s

número de certificados crl o certificados pem presentes en el archivo p7s

P.¿Cómo podemos saber la cantidad de archivos CRL o la cantidad de archivos PEM que se pueden generar a partir de un archivo P7S?

Entiendo (deaquí) que los datos contenidos en un archivo P7S no son más que los datos codificados (en formato ASN1, DER) del archivo PEM.

Entonces, si tengo un archivo P7S codificado (en formato ASN1, DER), uso algunos comandos OpenSSL para obtener datos ASN1PARSE y de los cuales obtengo CRL y finalmente obtengo PEM.

Sé que ASN1PARSE, cuando se usa con OpenSSL, proporciona un archivo de texto que contiene algunos desplazamientos, longitudes y longitudes de encabezado, mediante el cual extraemos las CRL (S) y PEM (S) mencionadas anteriormente.

Ahora mi pregunta es, como se mencionó en la primera línea de la publicación, ¿cómo puedo saber que estoy generando la cantidad correcta de archivos (crls, pems) a partir del archivo P7S?

Respuesta1

Un archivo PKCS#7, hoy en día definido enSintaxis de mensajes criptográficos (RFC 5652), puede contener muchos certificados y muchas CRL.

La forma normal de extraerlos con OpenSSL es utilizar:

openssl pkcs7 -in file.pem -print_certs -out certs.pem

o, si el archivo de entrada es DER:

openssl pkcs7 -inform DER -in file.p7s -print_certs -out certs.pem

La manpágina dice:

-print_certs
Imprime todos los certificados o CRL contenidos en el archivo. Están precedidos por el asunto y el nombre del emisor en formato de una línea.

No es necesario analizarlos asn1parsea menos que esté depurando o sea un glotón de castigo.

Lo anterior genera un único archivo que contiene todos los certificados y CRL. Si desea archivos individuales, debería poder canalizar la salida a través de awk, con algo similar a:

openssl pkcs7 -inform DER -in file.p7s -print_certs | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > "file-" i ".pem" }'

Esto simplemente creará un archivo para cada objeto con un nombre de archivo numérico. No diferencia entre certificados y CRL. Si lo necesita, puede modificar la cadena de búsqueda para que busque BEGIN CERTIFICATE, END CERTIFICATEo BEGIN X509 CRL, END X509 CRLy cambiar el "file-"y/o ".pem"por algo apropiado en cada caso.


Si quieres hacer esto en Python, usa el 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())

información relacionada