p7s 파일에 있는 crl 인증서 또는 pem 인증서 수

p7s 파일에 있는 crl 인증서 또는 pem 인증서 수

큐.P7S 파일에서 생성할 수 있는 CRL 파일 수 또는 PEM 파일 수를 어떻게 알 수 있나요?

나는 이해한다 (에서여기) P7S 파일에 포함된 데이터는 PEM 파일의 인코딩된(ASN1, DER 형식) 데이터일 뿐입니다.

따라서 ASN1, DER 형식으로 인코딩된 P7S 파일이 있는 경우 일부 OpenSSL 명령을 사용하여 ASN1PARSE 데이터를 가져오고 여기에서 CRL을 얻고 마지막으로 PEM을 얻습니다.

OpenSSL과 함께 ASN1PARSE를 사용하면 위에서 언급한 CRL(S) 및 PEM(S)을 추출하여 일부 오프셋, 헤더 길이 및 길이가 포함된 일부 텍스트 파일을 제공한다는 것을 알고 있습니다.

이제 내 질문은 게시물의 첫 번째 줄에서 언급했듯이 P7S 파일에서 올바른 수의 파일(crls, pems)을 생성하고 있는지 어떻게 알 수 있습니까?

답변1

현재 정의된 PKCS#7 파일암호화 메시지 구문(RFC 5652), 많은 인증서와 CRL을 보유할 수 있습니다.

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에는 다음과 같이 명시되어 있습니다.

-print_certs
파일에 포함된 모든 인증서나 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-"".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())

관련 정보