我需要使用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中做到这一点?
答案 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
模块本身添加适当的解决方案(具有正确的内存管理)。