python - 从 PKCS7 (signature&data) 中提取分离的 PKCS7 签名

标签 python openssl m2crypto

我想将包含数据+签名的 PKCS7 签名分解为单独的:python 中的原始数据和分离的 PKCS7 签名。

我可以从签名中获取数据,因为验证例程会返回它,但我如何才能获取分离的签名?

def verify_pkcs7(data_bio, signature_bio, cacert_bio, format=X509.FORMAT_PEM):
    sm_obj = SMIME.SMIME()
    st = X509.X509_Store()

    st.add_cert(X509.load_cert_string(cacert_bio))
    sm_obj.set_x509_store(st)


    if format == X509.FORMAT_PEM:
        p7 = SMIME.load_pkcs7_bio(signature_bio)
    else:
        p7 = SMIME.PKCS7(m2.pkcs7_read_bio_der(signature_bio._ptr()), 1)


    sk = p7.get0_signers(X509.X509_Stack())
    sm_obj.set_x509_stack(sk)

    try:
        v = sm_obj.verify(p7, data_bio)
        if v:
            print "Client signature verified."
            with open('file.rar', 'wb') as ff:
                ff.write(v)
    except Exception as e:
        print str(e)
        print "*** INVALID CLIENT MESSAGE SIGNATURE ***"

我的疯狂猜测是它是 these 之一功能.. 我的假设基于这样一个事实,即 M2Crypto 是 OpenSSL 的包装器。

最佳答案

M2Crypto.SMIME.smime_load_pkcs7_bio 函数将采用包含 SMIME 消息(由消息数据和 PKCS7 签名组成)的 BIO 缓冲区) 并返回一个包含两个值的元组:一个 PKCS7 对象和一个包含消息数据的 BIO。您可以将其 .write(buf) 与另一个 BIO 一起使用,以文本形式获取 PKCS7 签名。

但是,请注意 M2Crypto(仍然)不支持 Python 3,因此您只能使用 2.7。

关于此的 M2Crypto“文档”不值得链接,但这似乎是使用的底层 OpenSSL 函数:http://wiki.openssl.org/index.php/Manual:SMIME_read_PKCS7(3)

关于python - 从 PKCS7 (signature&data) 中提取分离的 PKCS7 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25105511/

相关文章:

java - 将 openssl 迁移到 java

python - Python + Selenium-如何检查使用CSS样式并显示为内容的图像?

python - 从服务器获取响应

c - 如何计算 X.509 证书的 SHA-1 指纹?

linux - 如何从 pem 或 crt 文件中的链中删除 SHA1 证书

python - 使用 m2crypto 从 PKCS7 SignedData 结构中提取签名证书

python - 无法安装 M2Crypto 包

python - 尝试使用 Python 验证 SHA1 消息签名。我究竟做错了什么?

python - qpython android IOError : [Erno 2] No such file or directory

python - 通过符号链接(symbolic link)启动正确的python程序