从PKCS7(签名和数据)中提取分离的PKCS7签名
我想把一个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)