我正在用 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。我正在使用 M2Crypto 库来访问 OpenSSL。我正在为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 以与 Ruby 相同的格式输出 CA 和 RA 证书?
更新:我想出了将产生相同文件的 openssl 命令。
openssl crl2pkcs7 -nocrl -certfile ca_cert.pem -certfile ra_cert.pem -out crl.der -outform DER
那么现在,我该如何在 Python 中做到这一点。这与这个问题相同