Openssl d2i_RSAPrivateKey无法解析RSA私钥

Openssl d2i_RSAPrivateKey无法解析RSA私钥,openssl,cryptography,ssl-certificate,rsa,x509,Openssl,Cryptography,Ssl Certificate,Rsa,X509,我有一个使用openssl的d2i_RSAPrivateKey函数解析私有RSA密钥的函数。我发现这在某些密钥上是成功的,但在其他密钥上不是成功的,即使所有这些密钥都是PEM编码的RSA密钥。我生成了自己的签名公钥和私钥,如下所示: openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 36500 -nodes -outform PEM 我将key.pem和cert.pem合并到一个文件combined.p

我有一个使用openssl的d2i_RSAPrivateKey函数解析私有RSA密钥的函数。我发现这在某些密钥上是成功的,但在其他密钥上不是成功的,即使所有这些密钥都是PEM编码的RSA密钥。我生成了自己的签名公钥和私钥,如下所示:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 36500 -nodes -outform PEM
我将key.pem和cert.pem合并到一个文件combined.pem中,并验证了我可以使用openssl的x509和rsa命令解析该文件:

openssl x509 -inform PEM -modulus -in combined.pem 
Modulus=B59A...

openssl rsa -inform PEM -modulus -in combined.pem 
Modulus=B59A...

但是d2i_RSAPrivateKey在代码中默默地解析此文件失败,返回错误代码而不打印任何内容。我知道我正确地使用了D2IrsaPrivateKey,因为它适用于不同的公共/私人证书文件。有人能告诉我为什么不能在命令行上解析我在这里创建的文件吗?

在与openssl开发人员讨论之后,结果证明我使用了错误的函数。我从d2i_私钥切换到d2i_私钥(在使用d2i_私钥提取EVP_PKEY后),它可以工作。我还从SSL_CTX_use_RSAPrivateKey_ASN1切换到SSL_CTX_use_PrivateKey,再次通过EVP_PEY,它工作了

一位openssl开发人员建议出现我的问题,因为“RSAPrivateKey的DER编码包含在PKCS8_PRIV_KEY_INFO的长八进制字符串元素中。您需要双重解码以获得实际的
RSAPrivateKey结构,无论是手动还是通过其他库函数。“我还没有测试过它,但我想至少发布这个变通解决方案。

间歇性故障可能是由于
主题公钥信息
而不是仅仅是
公钥
(私钥也是如此)。例如,请参见。如果它有一个OID,那么它是一个
主题公钥信息
(或等效私钥)。如果它没有OID,那么它只是一个
公钥
(或与之相当的私钥)。你可以看到PEM中的差异。一个将使用
BEGIN PRIVATE KEY
(带OID的一个),另一个将使用
BEGIN RSA PRIVATE KEY
(不带OID的一个)。谢谢!我检查发现这两个文件都有“----开始私钥------”。我在链接到的页面中运行了命令(opensslpkcs8-topk8-inform-PEM-outform PEM-in filename-out filename-nocrypt),将outform的DER更改为PEM,输出与输入相同。这里还有什么我可以查的吗?