从PKCS7(签名和数据)中提取分离的PKCS7签名

2 投票
1 回答
1309 浏览
提问于 2025-04-18 15:49

我想把一个PKCS7签名分开,这个签名里包含了数据和签名,我想把它们分成两个部分:原始数据和分离的PKCS7签名,使用Python来实现。

我可以从签名中获取数据,因为验证的过程会返回这些数据,但我该如何获取分离的签名呢?

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 ***"

我猜可能是这些函数中的某一个。我之所以这么想,是因为M2Crypto是OpenSSL的一个封装。

1 个回答

1

M2Crypto.SMIME.smime_load_pkcs7_bio 这个函数会接收一个包含 SMIME 消息的 BIO 缓冲区(这个消息包括了消息内容和 PKCS7 签名),然后返回两个值:一个 PKCS7 对象和一个包含消息内容的 BIO。你可以通过使用 .write(buf) 方法和另一个 BIO 来获取 PKCS7 签名的文本。

不过要注意的是,M2Crypto 目前还不支持 Python 3,所以你只能使用 2.7 版本。

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

撰写回答