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

标签 python pkcs#7 pyopenssl

我需要使用 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/

相关文章:

javascript - 将VueJS与Axios一起使用后响应数据消失

python - 在 Django/Django Rest 中添加两因素身份验证

c - OpenSSL C 程序在 PKCS7_sign 函数上变得无响应

c# - 如何从 C# 中的文件/流读取 Pkcs#7 证书链?

python - 为什么我在 Centos 上出现语法错误 python - pip

python - ImportError 在 MinGW-W64 Python 3.6 中导入 ssl

python - 如何使用django中的函数显示另一个表中的值

python - VS 代码 : How to auto refresh Pylint

php - 警告 : openssl_pkcs7_sign(): error getting private key using WAMP

Python 请求 : Where is Crypto. dll?