gpt4 book ai didi

python - 在 python 中从 pkcs7 中提取签名数据

转载 作者:行者123 更新时间:2023-11-28 18:08:25 28 4
gpt4 key购买 nike

我有一个 USB 加密 token ,能够签署数据并将其打包到 pkcs 文件中。然后我可以使用 openssl 从该文件中提取证书和数据,如下所示:

openssl cms -verify -in signature.p7s -inform DER -noverify -outform DER -signer cert.pem -out textdata

所以我的问题是如何使用 python (pyopenssl) 做同样的事情?

我已经尝试按照说明去做 here ,但有不同的情况 - 我附加了签名并且没有单独的签名和证书文件 - 我有 ASN.1 编码文件,其中包含作为数据和签名的证书

最佳答案

要实现您的目标,需要克服几个障碍。

首先,pyopenssl 绑定(bind)本身在涉及其 crypto 模块时是有限的,您需要的功能所在的模块。事实上,the pyopenssl crypto documentation状态: enter image description herepyca/cryptography提到的模块通过 pyopenssl crypto 模块的两个内部属性公开,名称为 _lib_ffi,需要使用它们来获取所需的功能。

然后 CMS_verify() 函数将是您的合乎逻辑的选择,它也不包含在 pyca/cryptography 绑定(bind)中。但是,为了您的目的,使用 PKCS7_verify() 可能就足够了——您可以在 StackExchange 问题 OpenSSL PKCS#7 vs. S/MIME 中阅读所有相关内容.函数crypto.load_pkcs7_data()派上用场。

综上所述,以下代码片段可能会为您完成——尽管根据您的描述,我不清楚签名者的证书是否包含在 .p7s 文件中(在在这种情况下,您不必像以前那样将 -signer 作为 openssl cms -verify 的参数)。它对我有用,所以试一试:

from OpenSSL import crypto
from OpenSSL._util import (
ffi as _ffi,
lib as _lib,
)

# Or, alternatively:
# from cryptography.hazmat.bindings.openssl.binding import Binding
# _lib = Binding.lib
# _ffi = Binding.ffi

with open('message_der.p7s', 'rb') as f:
p7data = f.read()
p7 = crypto.load_pkcs7_data(crypto.FILETYPE_ASN1, p7data)

bio_out =crypto._new_mem_buf()
res = _lib.PKCS7_verify(p7._pkcs7, _ffi.NULL, _ffi.NULL, _ffi.NULL, bio_out, _lib.PKCS7_NOVERIFY)
if res == 1:
databytes = crypto._bio_to_string(bio_out)
print(databytes)
else:
errno = _lib.ERR_get_error()
errstrlib = _ffi.string(_lib.ERR_lib_error_string(errno))
errstrfunc = _ffi.string(_lib.ERR_func_error_string(errno))
errstrreason = _ffi.string(_lib.ERR_reason_error_string(errno))

如果您决定使用这种方法,这里是 a caveat about using this OpenSSL bindings module directly : enter image description here

关于python - 在 python 中从 pkcs7 中提取签名数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52344287/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com