我目前正在扩展一个同事编写的一些 python 代码,以便将 X509 证书与 OpenSSL 库一起使用。除了少数几个 OpenSSL 功能外,我已经设法让所有功能正常工作。我正在使用的库/函数是
from OpenSSL.crypto import FILETYPE_PEM
from OpenSSL.crypto load_certificate, verify, sign, load_privatekey
我目前正在我的本地机器上创建证书
openssl req -x509 -newkey rsa:2048 -out rootcert.pem -outform PEM -days 1825
然后将其“推送”到服务器(也在本地机器上),然后返回一个 64 个字符长的随机字母数字字符串。然后我拿字符串并使用它签名
openssl rsautl -sign -inkey rootprivkey.pem -in string -out signedstring
当我将签名的随机字符串推送到服务器时,它需要使用我之前发送的证书来验证(使用 OpenSSL.crypto.verify),该过程失败。但是,如果我在命令行 ( openssl rsautl -verify -inkey rootprivkey.pem -in signedstring
) 上使用验证功能,它就可以工作。
如果我将私钥推送到服务器并使用 OpenSSL.crypto.sign ( sign(private key, data, digest)
) 函数对相同的随机字符串进行签名并将其放入 verify ( verify(certificate, signature, data, digest)
) 函数中,它就可以工作。
在对字符串进行签名时,我尝试了所有不同类型的填充,但都没有奏效。我也尝试过首先对字符串进行摘要哈希,然后根据关于 SO 的一个旧问题对该文件进行签名:
openssl dgst -sha1 -binary < string > digeststring
openssl rsautl -sign -inkey rootprivkey.pem -keyform PEM -in digeststring > signedstring
但显然这也不起作用。
我不知道我是否生成了证书并错误地签署了字符串,我是否错误地使用了 OpenSSL.crypto 库(我已经检查了很多次以确保我将正确的变量传递给 OpenSSL 函数),或者如果命令行函数和 python 函数不兼容。
以供参考:
Python 2.7.3
OpenSSL 1.0.1 (March 12)