在python中获取PKCS7签名者链

Vic*_*nin 14 python certificate pyopenssl m2crypto pkcs#7

我有签名的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)
Run Code Online (Sandbox Code Playgroud)

有用.但是,certStack只返回一个证书(而不是返回整个证书链.

两个问题:

  • 我错过了什么(可能有一个选项,让它知道我需要整个链)
  • 有没有其他方法如何获得整个链(可能使用pyopenssl)?

mpr*_*net 5

我猜你在签名者和签名者的证书链之间混淆了.PKCS7_get0_signers返回签名者列表.

要使用2个签名者构建PKCS7消息,您可以使用以下步骤:

  1. 为第一个签名者建立密钥和证书:

    openssl genrsa -out key1.pem
    openssl req -new -key key1.pem -subj "/CN=key1" | openssl x509 -req -signkey key1.pem -out cert1.pem
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为第二个签名者建立密钥和证书:

    openssl genrsa -out key2.pem
    openssl req -new -key key2.pem -subj "/CN=key2" | openssl x509 -req -signkey key2.pem -out cert2.pem
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用两个签名者创建PKCS7消息:

    echo "Hello" | openssl smime -sign -nodetach \
      -out signature.der -outform DER \
      -inkey key1.pem -signer cert1.pem -inkey key2.pem -signer cert2.pem 
    
    Run Code Online (Sandbox Code Playgroud)

然后可以打印签名者运行你的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())
Run Code Online (Sandbox Code Playgroud)

它给签名者的签发者:

CN = key1
CN = key2

  • @VictorRonin为了获得证书链`openssl pkcs7 -print_certs`(参见[pkcs7.c](https://github.com/openssl/openssl/blob/master/apps/pkcs7.c))使用`p7-> d.sign->certs`。这不能直接通过 m2crypto 接口访问,也许可以使用 asn1 解析来检索...... (2认同)