使用pyopenssl验证签名

6

我认为自从这个 问题 后,pyOpenSSL已经开始支持签名验证(截至pyOpenSSL 0.11)。

我正在处理一个由其他人使用M2Crypto开始的项目。 M2Crypto很难包含在诸如Heroku之类的平台上,因为它需要使用SWIG。因此,我试图删除对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的值实际上不是它应该使用的值!
我一直在尝试用这里的原始代码,需要相当多的工作来整理,但是我尝试逐步替换功能,然后进行全面重构。非常感谢任何指导!pyOpenSSL是否具有替换此处M2Crypto功能的能力,并且我是否正在正确地处理它?

如果有人在尝试学习如何使用gpg验证pip软件包的签名(就像我一样)而来到了这里,实际上您需要的是这个:https://stackoverflow.com/a/62687869/1174102。 - Michael Altfield
1个回答

8

所以答案来自于阅读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的验证不同,后者需要使用哈希数据字符串来执行其验证。注意,我没有深入研究M2Crypto的功能以确定发生了什么。

感谢exarkunpyOpenSSL邮件列表上的回复,指出错误在于我的verify()调用,而不是我对verify()的理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接