2016-01-06 34 views
14

我有簽名的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)?

回答

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 
  • 生成密鑰和證書:對於第一個簽名者

    1. 生成密鑰和證書籤名者:

      openssl genrsa -out key2.pem 
      openssl req -new -key key2.pem -subj "/CN=key2" | openssl x509 -req -signkey key2.pem -out cert2.pem 
      
    2. 同時使用SIG創建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

  • +0

    我知道簽名者和簽署者證書鏈之間的區別。你擁有的代碼通常與我的代碼(提取簽名者)相同。但是,它對證書鏈沒有任何作用。我得到了我的PKCS7,並能夠使用「openssl pkcs7 print_certs」命令(它顯示證書鏈存儲在那裏)提取鏈。一般來說,我的問題是如何從PKCS7 –

    +1

    @VictorRonin中提取(在python代碼中)這些證書鏈以獲得證書鏈'openssl pkcs7 -print_certs'(請參見[pkcs7.c](https://github.com/) openssl/openssl/blob/master/apps/pkcs7.c))使用'p7-> d.sign-> certs'。這不能通過m2crypto接口直接訪問,也許可以使用asn1解析來檢索... – mpromonet