使用pyopenssl验证签名

时间:2012-08-27 17:54:11

标签: python ssl certificate m2crypto pyopenssl

我相信自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功能,我是否正确地采用它?

1 个答案:

答案 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的功能来解决正在发生的事情。

感谢exarkunpyOpenSSL mailing list的回复,它指出了我在调用verify()时遇到的错误,而不是我对verify()正在做什么的理解。