验证签名与pyopenssl
我相信,因为这question,pyOpenSSL已经开始支持签名(核查为pyOpenSSL 0.11。验证签名与pyopenssl
我在其上使用M2Crypto别人启动了一个项目工作。M2Crypto真的很痛因为它需要使用SWIG因此,我试图删除对M2Crypto的依赖,并用pyOpenSSL替换,这很容易通过Pip安装,并且不需要定制buildpacks以及更多哪些与SWIG相关的内容事情是这样的
我遇到的问题是取代一点代码:
key = cert.get_pubkey() # Cert is an M2Crypto X509 object
key = key.get_rsa()
ret = key.verify(hashed, self.sig)
if ret != 1:
# Cert invalid ... etc.
理想我想实现通过pyOpenSSL相同的功能,但觉得我可能已经拿到了棍子的错误结束 - 我已经尝试使用:
crypto.verify(cert, self.sig, hashed, 'sha1')
但失败 -
[('rsa routines', 'RSA_verify', 'bad signature')]
我不能工作了,无论是失败,因为签名实际上是不好的,还是因为价值观我提供crypto.verify实际上不是什么是应该用于!
我一直在玩的原始代码是here,需要相当多的工作来整理,但一直试图在整个重构之前一次替换功能。任何指针将非常感激! pyOpenSSL能否在这里取代M2Crypto的功能,我是否正确地做了这件事?
所以答案来自于阅读更多的pyOpenSSL的来源,从exarkun指针。 pyOpenSSL确实可以替代这里的M2Crypto依赖,只需对底层代码进行很小的修改。
的单元测试的crypto.verify()函数here显示通话服用:
verify(good_cert, sig, content, digest)
因此出现了在我上面的代码中的错误:
crypto.verify(cert, self.sig, hashed, 'sha1')
本应简单地采取“数据',而不是散列,因为签名被应用于原始数据串:
# N.B. cert = X509 object (from crypto.load_certificate())
crypto.verify(cert, self.sig, data, 'sha1')
此行为似乎不同于M2Crypto的验证,它使用散列数据字符串执行验证。注意我还没有深入研究M2Crypto的功能,以确定发生了什么。
感谢exarkun他上向我指出错误在我的电话验证(为pyOpenSSL mailing list)的反应,而不是我的什么验证理解()在做什么。