我相信从这个question开始,pyOpenSSL已经开始支持签名验证(从pyOpenSSL 0.11开始。
我正在从事一个项目,这是由其他人使用M2Crypto启动的。在Heroku这样的平台上包含M2Crypto真的很痛苦,因为它需要使用SWIG。因此,我正在尝试移除对M2Crypto的依赖,取而代之的是pyOpenSSL,它很容易通过Pip安装,并且不需要自定义构建包和更多与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功能吗?我这样做对吗?
发布于 2012-09-01 01:54:06
因此,答案来自于更多地阅读pyOpenSSL的源代码,其中一个指针来自exarkun。在这里,pyOpenSSL确实可以取代M2Crypto依赖,只需对底层代码进行很小的更改。
crypto.verify()函数here的单元测试显示了调用:
verify(good_cert, sig, content, digest)因此,我上面的代码中有一个错误:
crypto.verify(cert, self.sig, hashed, 'sha1')它应该简单地获取' data ',而不是散列,因为签名被应用于原始数据字符串:
# N.B. cert = X509 object (from crypto.load_certificate())
crypto.verify(cert, self.sig, data, 'sha1')此行为似乎与M2Crypto的verify不同,后者采用散列数据字符串来执行其验证。注意,我还没有深入研究M2Crypto的函数来弄清楚到底是怎么回事。
感谢exarkun在pyOpenSSL mailing list上的回应,它指出了我对verify()的调用中的错误,而不是我对verify()所做的事情的理解。
https://stackoverflow.com/questions/12146985
复制相似问题