p7s ファイルに存在する crl 証明書または pem 証明書の数

p7s ファイルに存在する crl 証明書または pem 証明書の数

質問。P7S ファイルから生成できる CRL ファイルの数または PEM ファイルの数を確認するにはどうすればよいでしょうか?

理解しました(からここ) P7S ファイルに含まれるデータは、PEM ファイルのエンコードされた (ASN1、DER 形式) データに他なりません。

したがって、(ASN1、DER 形式で) エンコードされた P7S ファイルがある場合は、いくつかの OpenSSL コマンドを使用して ASN1PARSE データを取得し、そこから CRL を取得し、最後に PEM を取得します。

ASN1PARSE を OpenSSL で使用すると、オフセット、ヘッダー長、長さを含むテキスト ファイルが生成され、それを使用して上記の CRL と PEM を抽出できることはわかっています。

さて、私の質問は、投稿の最初の行で述べたように、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ページには次のように書かれています:

-プリント証明書
ファイルに含まれる証明書または CRL を出力します。それらの前には、サブジェクト名と発行者名が 1 行形式で表示されます。

asn1parseデバッグ中や苦痛を甘受する場合を除き、これらを解析する必要はありません。

awk上記は、すべての証明書と CRL を含む単一のファイルを出力します。個別のファイルが必要な場合は、次のように出力を にパイプすることができます。

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())

関連情報