2016-01-06 39 views
14

Ich habe eine PKCS7-Nachricht, die signiert ist. Es enthält ein Daten- und ein Signaturzertifikat (mit der gesamten Vertrauenskette).PKCS7-Unterzeichnerkette in Python erhalten

Ich habe einen Code, der m2crypto verwendet, um ein Zertifikat daraus zu erhalten.

bio = BIO.MemoryBuffer(pkcs7message) 
p7 = SMIME.PKCS7(m2.pkcs7_read_bio_der(bio._ptr())) 
sk = X509.X509_Stack() 
certStack = p7.get0_signers(sk) 

Es funktioniert. Allerdings gibt certStack nur ein Zertifikat (statt der gesamten Kette von Zertifikaten Rückkehr

Zwei Fragen:.

  • bin ich etwas fehlt (kann es eine Option ist es zu wissen, dass ich die ganze brauchen Kette)
  • gibt es andere Methoden, wie die gesamte Kette zu erhalten (unter Verwendung von pyopenssl werden)?

Antwort

5

ich denke, man eine Verwirrung zwischen signers machen und Zertifikatskette eines signer. PKCS7_get0_signers die Liste der Unterzeichner zurückkehren

Um eine PKCS7 Nachricht mit 2 signers zu erstellen, können Sie folgende Schritte ausführen:

  1. Build-Schlüssel und das Zertifikat für den ersten Unterzeichner:

    openssl genrsa -out key1.pem 
    openssl req -new -key key1.pem -subj "/CN=key1" | openssl x509 -req -signkey key1.pem -out cert1.pem 
    
  2. Build-Schlüssel und das Zertifikat für die zweite Unterzeichner:

    openssl genrsa -out key2.pem 
    openssl req -new -key key2.pem -subj "/CN=key2" | openssl x509 -req -signkey key2.pem -out cert2.pem 
    
  3. Erstellen Sie eine PKCS7-Nachricht mit beiden sig ners:

    echo "Hello" | openssl smime -sign -nodetach \ 
        -out signature.der -outform DER \ 
        -inkey key1.pem -signer cert1.pem -inkey key2.pem -signer cert2.pem 
    

Dann signers gedruckt Ihren Python-Skript ausgeführt werden:

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()) 

Es gibt den Emittenten signers:

CN = Schlüssel1
CN = key2

+0

Mir ist der Unterschied zwischen einer Unterzeichner- und Unterzeichnerzertifikatkette bekannt. Der Code, den Sie haben, entspricht im Allgemeinen meinem Code (um Unterzeichner zu extrahieren). Es tut jedoch nichts, um Ketten zu bescheinigen. Ich habe mein PKCS7 bekommen und konnte die Kette mit dem Befehl "openssl pkcs7 print_certs" extrahieren (was zeigt, dass die Zertifikatskette dort irgendwo gespeichert ist). Im Allgemeinen ist meine Frage, wie man (in Python-Code) diese Zertifikatskette aus PKCS7 –

+1

@VictorRonin extrahiert, um die Zertifikatskette 'openssl pkcs7 -print_certs' zu erhalten (siehe [pkcs7.c] (https://github.com/) openssl/openssl/blob/master/apps/pkcs7.c)) benutzen Sie 'p7-> d.sign-> certs'. Dies ist nicht direkt über die m2crypto-Schnittstelle möglich, vielleicht könnte es mithilfe von asn1 parsing abgerufen werden ... – mpromonet