我有签名的PKCS7消息。它包含数据和签名证书(具有整个信任链)。
我有一个代码,它使用m2crypto来获取证书。
bio = BIO.MemoryBuffer(pkcs7message)
p7 = SMIME.PKCS7(m2.pkcs7_read_bio_der(bio._ptr()))
sk = X509.X509_Stack()
certStack = p7.get0_signers(sk)
有效。但是,certStack只返回一个证书(而不是返回整个证书链。
两个问题:
答案 0 :(得分:5)
我猜你在签名者的签名者和证书链之间混淆了。 PKCS7_get0_signers返回签名者列表。
为了使用2个签名者构建PKCS7消息,您可以使用以下步骤:
为第一个签名者建立密钥和证书:
openssl genrsa -out key1.pem
openssl req -new -key key1.pem -subj "/CN=key1" | openssl x509 -req -signkey key1.pem -out cert1.pem
为第二个签名者构建密钥和证书:
openssl genrsa -out key2.pem
openssl req -new -key key2.pem -subj "/CN=key2" | openssl x509 -req -signkey key2.pem -out cert2.pem
使用两个签名者创建PKCS7消息:
echo "Hello" | openssl smime -sign -nodetach \
-out signature.der -outform DER \
-inkey key1.pem -signer cert1.pem -inkey key2.pem -signer cert2.pem
然后可以打印签名者运行你的python脚本:
from M2Crypto import *
bio=BIO.File(open('signature.der'))
smime_object = SMIME.PKCS7(m2.pkcs7_read_bio_der(bio._ptr()))
signers = smime_object.get0_signers(X509.X509_Stack())
for cert in signers:
print(cert.get_issuer().as_text())
它给签名者'发行人:
CN = KEY1
CN = KEY2