我相信自question以来,pyOpenSSL已开始支持签名验证(截至pyOpenSSL 0.11。
我正在开发一个由其他人使用M2Crypto启动的项目。由于需要使用Heroku,因此在SWIG等平台上加入M2Crypto非常痛苦。因此,我试图消除对M2Crypto的依赖,并替换为易于通过Pip安装的pyOpenSSL,并且不需要自定义构建包以及更多与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功能,我是否正确地采用它?
答案 0 :(得分:7)
所以答案来自于阅读pyOpenSSL的更多信息源,并使用exarkun的指针。 pyOpenSSL确实可以在这里替换M2Crypto依赖,只需对底层代码进行微小的更改。
crypto.verify()函数here的unittest显示了呼叫:
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的回复,它指出了我在调用verify()时遇到的错误,而不是我对verify()正在做什么的理解。