我需要使用 PyOpenSSL 在 Python 中获取某个字符串的分离 PKCS #7 签名。我在 .p12 文件中有一个 key 。
到目前为止,我正在尝试这样做:
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)
但这不是必需的。
我在网上搜索过,但大多数示例都与签署电子邮件 block 和使用 M2Crypto 有关。有没有办法在裸 PyOpenSSL 中做到这一点?
最佳答案
您为此所需的 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
模块本身。
关于python - PKCS #7 使用 Python 和 PyOpenSSL 分离签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33634379/