Получение цепочки подписчиков PKCS7 в python

У меня есть сообщение 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 возвращает только один сертификат (вместо того, чтобы возвращать целую цепочку сертификатов.

Два вопроса:

  • Я что-то упускаю (возможно, есть возможность сообщить ему, что мне нужна целая цепочка)
  • Есть ли другие методы, как получить целую цепочку (может быть, pyopenssl)?

Ответы

Ответ 1

Я предполагаю, что вы путаете между подписью и цепочкой сертификатов подписывающего лица. PKCS7_get0_signers вернуть список подписчиков.

Чтобы создать сообщение 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 script:

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 = ключ1
CN = ключ2