我想将包含数据+签名的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的包装。
答案 0 :(得分:1)
M2Crypto.SMIME.smime_load_pkcs7_bio
函数将采用包含BIO
消息的SMIME
缓冲区(由消息数据和PKCS7签名组成)并返回两个值的元组:{{1对象和包含消息数据的PKCS7
。您可以将PKCS7签名作为文本使用BIO
和另一个.write(buf)
。
但请注意,M2Crypto(仍然)不支持Python 3,因此您将限制为2.7。
M2Crypto"文档"这不值得链接,但这似乎是使用的基础OpenSSL函数:http://wiki.openssl.org/index.php/Manual:SMIME_read_PKCS7(3)