【发布时间】:2013-03-29 09:54:43
【问题描述】:
我需要获取 PKCS#7 信封的摘要来手动检查它。
通常当您想要验证 pkcs#7 信封的签名时,您会这样做:
from M2Crypto import SMIME, X509, BIO
sm_obj = SMIME.SMIME()
x509 = X509.load_cert(join(PATH, 'QualifiedChain.crt'))
sk = X509.X509_Stack()
sk.push(x509)
sm_obj.set_x509_stack(sk)
st = X509.X509_Store()
st.load_info(join(PATH, 'QualifiedChain.crt'))
sm_obj.set_x509_store(st)
# re-wrap signature so that it fits base64 standards
cooked_sig = '\n'.join(raw_sig[pos:pos + 76] for pos in
xrange(0, len(raw_sig), 76))
# now, wrap the signature in a PKCS7 block
sig = "-----BEGIN PKCS7-----\n%s\n-----END PKCS7-----\n" % cooked_sig
# and load it into an SMIME p7 object through the BIO I/O buffer:
buf = BIO.MemoryBuffer(sig)
p7 = SMIME.load_pkcs7_bio(buf)
signers = p7.get0_signers(sk)
certificat = signers[0]
data_bio = BIO.MemoryBuffer(MSG)
sm_obj.verify(p7, data_bio) # This is the line that count.
但在我的例子中,摘要类型是 openssl 无法识别的 md5sha1:
$ openssl list-message-digest-commands
md4
md5
rmd160
sha
sha1
我需要做的是获取 pkcs#7 签名内容并手动检查它。
我需要的是一个相当于org.bouncycastle.cms.CMSSignedDataParser的Python。
如何让摘要能够手动验证而无需使用sm_obj.verify?
【问题讨论】:
-
我从未听说过“md5sha1”摘要,谷歌搜索似乎也没有任何结果。也许就像它读到的那样? SHA1 的 MD5?您从哪里得知摘要是 md5sha1?
-
这是一些签名服务器的自定义摘要,这就是我需要手动验证它的原因。 md5sha1 只是 bash 哈希的连接。
-
看看v13.gr/blog/?p=303。这可能是从 PKCS7 信封中获取内容和签名然后手动验证它的替代方法。
-
@likeitlikeit 看起来真不错。您介意为这篇文章创建一个答案并复制其中的代码吗?
-
@likeitlikeit 这是检查要由 cacert 签名的证书 无法检查 pkcs7 是否由 certficate 签名会尝试修改它。