6

我相信自从这个问题以来,pyOpenSSL 已经开始支持签名验证(从pyOpenSSL 0.11开始。

我正在开发一个由其他人使用M2Crypto启动的项目。M2Crypto 包含在Heroku等平台上真的很痛苦,因为它需要使用SWIG。因此,我试图删除对 M2Crypto 的依赖并替换为易于通过 Pip 安装的 pyOpenSSL,并且不需要自定义 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 值实际上不是它应该用于的!

我一直在玩的原始代码在这里,需要大量的工作来整理,但试图在完全重构之前一次替换功能。任何指针将不胜感激!pyOpenSSL 是否有能力在这里替换 M2Crypto 功能,我是否以正确的方式进行?

4

1 回答 1

8

因此,答案来自阅读更多 pyOpenSSL 的源代码,并带有来自exarkun的指针。pyOpenSSL 确实可以在这里替换 M2Crypto 依赖项,只需对底层代码进行非常小的更改。

此处crypto.verify() 函数的单元测试显示了调用:

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 邮件列表的回复,这让我指出了我调用 verify() 时的错误,而不是我对 verify() 在做什么的理解。

于 2012-08-31T17:54:05.640 回答