Python でSCEPサーバーを実装しています。SCEP 仕様ではPKIOperation
、「証明書のみの PKCS#7」で応答するよう求められています。Apple には、次のことを行う Ruby の参照実装があります。
require 'openssl'
@@root_cert = OpenSSL::X509::Certificate.new(File.read("ca_cert.pem"))
@@ra_cert = OpenSSL::X509::Certificate.new(File.read("ra_cert.pem"))
scep_certs = OpenSSL::PKCS7.new()
scep_certs.type="signed"
scep_certs.certificates=[@@root_cert, @@ra_cert]
File.open('from_ruby.der', 'w') { |file| file.write(scep_certs.to_der)}
このコードは、CA 証明書と RA 証明書の両方を含む PCKS7 DER ファイルを正しく出力します。このコードを Python に移植しようとしています。OpenSSL へのアクセスに M2Crypto ライブラリを使用しています。M2Crypto.SMIME.PKCS7にメソッドがないことに苦労していcertificates
ます。これまでのところ、私は次のことを考え出しました。
from M2Crypto import X509
ca_cert = X509.load_cert('ca_cert.pem')
ra_cert = X509.load_cert('ra_cert.pem')
stack = X509.X509_Stack()
stack.push(ca_cert)
stack.push(ra_cert)
derFile = open('from_python.der', 'w')
derFile.write(stack.as_der())
この Python コードは、両方の証明書が含まれているように見える DER エンコード ファイルを出力します。ただし、OpenSSL はこのファイルを読み取ることができません。
openssl pkcs7 -in from_ruby.der -inform DER -print_certs
Rubyスクリプトから証明書をうまく出力しますが、
openssl pkcs7 -in from_python.der -inform DER -print_certs
このエラーをスローします
unable to load PKCS7 object
89377:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:/SourceCache/OpenSSL098/OpenSSL098-47.1/src/crypto/asn1/tasn_dec.c:1315:
89377:error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error:/SourceCache/OpenSSL098/OpenSSL098-47.1/src/crypto/asn1/tasn_dec.c:827:
89377:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:/SourceCache/OpenSSL098/OpenSSL098-47.1/src/crypto/asn1/tasn_dec.c:747:Field=type, Type=PKCS7
Python で CA 証明書と RA 証明書の両方を Ruby と同じ形式で出力するにはどうすればよいですか?
更新:同じファイルを生成する openssl コマンドを見つけました。
openssl crl2pkcs7 -nocrl -certfile ca_cert.pem -certfile ra_cert.pem -out crl.der -outform DER
では、Python でそれを行うにはどうすればよいでしょうか。この質問と同じものはどれですか