验证签名与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)的反应,而不是我的什么验证理解()在做什么。