
質問。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())