2

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 でそれを行うにはどうすればよいでしょうか。この質問と同じものはどれですか

4

3 に答える 3

-1

私はそれが次のようなものだと感じています(完全にテストされていません):

an_smime = M2Crypto.SMIME.SMIME()
an_smime.set_x509_stack(stack)
an_smime.write(M2Crypto.BIO.File('from_python.der'), pkcs7=True)
于 2013-08-25T23:53:02.243 に答える