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

PKCS#7使用Python和PyOpenSSL分离签名,python,pkcs#7,pyopenssl,Python,Pkcs#7,Pyopenssl,我需要使用PyOpenSSL获得Python中某个字符串的分离PKCS#7签名。我在.p12文件中有一个密钥 到目前为止,我正在努力做到: 从OpenSSL.crypto导入加载\u pkcs12,签名 pkcs12=加载pkcs12(键数据,键pwd) algo=pkcs12.get_certificate().get_signature_algorithm() pkey=pkcs12.get_privatekey() sg=符号(pkey、manifest、algo) 但这不是必须的 我搜

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

到目前为止,我正在努力做到:

从OpenSSL.crypto导入加载\u pkcs12,签名
pkcs12=加载pkcs12(键数据,键pwd)
algo=pkcs12.get_certificate().get_signature_algorithm()
pkey=pkcs12.get_privatekey()
sg=符号(pkey、manifest、algo)
但这不是必须的

我搜索过net,但大多数示例都与签名电子邮件块和使用M2Crypto有关。在裸PyOpenSSL中有什么方法可以做到这一点吗?

实现这一点所需的PKCS#7 OpenSSL函数似乎不是由Python OpenSSL包装器导出的。您可以尝试通过crypto模块的内部实现这一点,例如,如以下代码段:

>>> 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编码。在OpenSSL的
PKCS7.h
头文件中定义了
PKCS7_
的常量值

您可能知道,任何以
开头的标识符都是
加密
模块的内部标识符,您不应该直接使用这些标识符。因此,这个答案只是为了举例说明。应向
加密
模块本身添加适当的解决方案(具有正确的内存管理)