2015-11-10 61 views
2

我需要使用PyOpenSSL獲取Python中某個字符串的分離的PKCS#7簽名。我在.p12文件中有一個密鑰。使用Python和PyOpenSSL的PKCS#7分離簽名

到目前爲止,我想這樣做:

from OpenSSL.crypto import load_pkcs12, sign 

pkcs12 = load_pkcs12(key_dat, key_pwd) 
algo = pkcs12.get_certificate().get_signature_algorithm() 
pkey = pkcs12.get_privatekey() 
sg = sign(pkey, manifest, algo) 

但它並不需要什麼。

我搜索了網絡,但大多數例子都與簽署電子郵件大塊和使用M2Crypto有關。有沒有辦法在PyOpenSSL中使用它?

回答

3

您需要的PKCS#7 OpenSSL函數似乎並未被Python OpenSSL封裝器導出。你可以嘗試通過密碼模塊的內部要做到這一點,比如像下面的代碼片段:

>>> with open('cleg.p12', 'r') as f: 
... p12data=f.read() 
>>> p12=crypto.load_pkcs12(p12data,'passphrase') 
>>> signcert=p12.get_certificate() 
>>> pkey=p12.get_privatekey() 
>>> bio_in=crypto._new_mem_buf(manifest) 
>>> PKCS7_DETACHED=0x40 
>>> pkcs7=crypto._lib.PKCS7_sign(signcert._x509, pkey._pkey, crypto._ffi.NULL, bio_in, PKCS7_DETACHED) 
>>> bio_out=crypto._new_mem_buf() 
>>> crypto._lib.i2d_PKCS7_bio(bio_out, pkcs7) 
1 
>>> sigbytes=crypto._bio_to_string(bio_out) 

在此之後,sigbytes包含編碼的簽名,ASN.1 DER。 PKCS7_DETACHED的常量值在OpenSSL的pkcs7.h頭文件中定義。

如您所知,任何以_開頭的標識符都位於crypto模塊的內部,因此不應被您直接使用。因此,這個答案僅用於說明目的。應該在crypto模塊本身中添加適當的解決方案(具有正確的內存管理)。