使用Python和PyOpenSSL的PKCS#7分离签名

时间:2015-11-10 16:06:41

标签: python pkcs#7 pyopenssl

我需要使用PyOpenSSL在Python中获得某个字符串的分离PKCS#7签名。我在.p12文件中有一个密钥。

到目前为止,我正在尝试这样做:

 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中做到这一点?

1 个答案:

答案 0 :(得分:6)

您需要的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模块本身添加适当的解决方案(具有正确的内存管理)。