我有一个使用openssl的d2i_RSAPrivateKey函数解析私有RSA密钥的函数。虽然所有这些密钥都是PEM编码的RSA密钥,但我发现这可以通过某些密钥成功,而不是其他密钥。我生成了自己签名的公钥和私钥,如下所示:
openssl x509 -inform PEM -modulus -in combined.pem
Modulus=B59A...
openssl rsa -inform PEM -modulus -in combined.pem
Modulus=B59A...
我将key.pem和cert.pem合并到一个文件combined.pem中,并验证我可以使用openssl的x509和rsa命令解析文件:
import os
cmd = 'dir'
fp = os.popen(cmd)
print(fp.read()) --Prints the results to the screen
res = fp.read()
fob = open('popen_output.txt','w')
fob.write(res)
fob.close()
fp.close()
但是d2i_RSAPrivateKey无法在代码中解析此文件,返回错误代码而不打印任何内容。我知道我正确使用d2i_RSAPrivateKey,因为它适用于不同的公共/私有证书文件。谁能说出为什么它无法解析我在命令行上创建的文件?
答案 0 :(得分:2)
在与openssl开发人员的一个线程之后,结果发现我使用了错误的函数。我从d2i_RSAPrivateKey切换到d2i_PrivateKey(在用d2i_PrivateKey解压缩EVP_PKEY之后),它可以工作。我也从SSL_CTX_use_RSAPrivateKey_ASN1切换到SSL_CTX_use_PrivateKey,再次传入EVP_PEY,它可以工作。
其中一个openssl开发人员提出我的问题是因为“RSAPrivateKey的DER编码是PKCS8_PRIV_KEY_INFO的长OCTET STRING元素中包含的内容。你需要进行双重解码以获得实际值 RSAPrivateKey结构,无论是手工还是通过其他库函数。“我还没有测试过,但我想至少发布这个解决方案。