【问题标题】:OpenSSL PEM_read_RSAPublicKey and PEM_read_RSA_PUBKEY crashes the programOpenSSL PEM_read_RSAPublicKey 和 PEM_read_RSA_PUBKEY 使程序崩溃
【发布时间】:2016-12-11 22:25:04
【问题描述】:

我有一个形式为

的公钥
-----BEGIN PUBLIC KEY-----
MIIB...
-----END PUBLIC KEY-----

使用 OpenSSL 创建的。我尝试像这样将它加载到内存中:

FILE* file = fopen("public.pem","r");
if (file != nullptr)
{
   //This can be changed to this for the same results:
   //RSA* rsa = PEM_read_RSAPublicKey(file, nullptr, nullptr, nullptr);
   RSA* rsa = PEM_read_RSA_PUBKEY(file, nullptr, nullptr, nullptr);
   //etc...
}

只要到达 RSA* rsa =... 行,程序就会崩溃。我已经看到了其他帖子,并且(如您所见)我已经尝试了解决方案,但它不起作用。

我尝试使用 BIO 版本,程序没有崩溃,但我确实收到错误“无起始行”。

关于什么可能导致这种情况的任何想法?

【问题讨论】:

  • 我认为您需要指向将读取数据的有效结构,而不是使用 nullptr。
  • 也许不应该给 PEM_read_RSA_PUBKEY 方法nullptrs?
  • 我试过:if (!PEM_read_RSA_PUBKEY(file, &rsa, nullptr, nullptr)) (其中 rsa 是使用 RSA_new() 初始化的),但它仍然崩溃。如果您使用密码,最后两个字段只是密码字段。倒数第二个是用于查找密码的回调函数指针,最后一个是指向 char* 的 void*。我的确实有密码,但在最后一个参数中使用 (void*)password 没有帮助。

标签: c++ c openssl


【解决方案1】:
RSA* rsa = PEM_read_RSA_PUBKEY(file, nullptr, nullptr, nullptr);

第二个参数不能为 NULL。这导致你的崩溃。此外,它是一个指向指针的指针(双重间接)。另请参阅PEM_read_RSA_PUBKEY man pages

也许你应该使用类似的东西:

RSA* t = RSA_new();
RSA* rsa = PEM_read_RSA_PUBKEY(file, &t, nullptr, nullptr);

数据可能格式不正确,并可能导致意外崩溃。如果您提供真实数据,那么我们通常可以进行交叉核对。在没有真实数据的情况下,我们无法真正说出。

您可能还想访问How to generate RSA private key using openssl?。它向您展示了几种 RSA 输出格式。它还向您展示了如何使用 C++ 管理 OpenSSL 资源。

【讨论】:

  • 我尝试了您的选项,但它仍然崩溃。我转而使用文件 BIO,并且效果很好。我以前遇到过 OpenSSL 和 FILE 的问题,所以不知道发生了什么。感谢您的输入:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多