我相信,自从question以来,pyOpenSSL已经开始支持签名验证(从pyOpenSSL 0.11开始)。

我正在一个项目,这个项目是由其他人使用M2Crypto启动的。将M2Crypto包含在诸如Heroku之类的平台上确实很痛苦,因为它需要使用SWIG。因此,我试图消除对M2Crypto的依赖,并替换为pyOpenSSL,后者可以通过Pip轻松安装,并且不需要自定义buildpack,也不需要其他与​​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的verify行为不同,后者使用散列数据字符串执行其验证。请注意,我还没有对M2Crypto的功能进行特别深入的研究以弄清楚发生了什么。

感谢exarkunpyOpenSSL mailing list的回复,该回复使我指出在我对verify()的调用中出现了错误,而不是我对verify()在做什么的理解。

关于python - 使用pyopenss验证签名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12146985/

10-12 16:38