【问题标题】:Initializing SSL and libcurl and getting "out of memory"初始化 SSL 和 libcurl 并“内存不足”
【发布时间】:2015-01-20 15:17:00
【问题描述】:

我打算用 C++ 程序用 libcurl 和 openssl 做 https 请求。

我按照文档中的描述使用 curl_global_init(CURL_GLOBAL_ALL) 初始化了 libcurl。然后我使用我初始化的curl_easy 句柄,填充标题和正文,并将所有内容发送到'https://example.com:443/foo'。它适用于非 https 连接。

Looking around 我发现可能有其他库已经获得了 SSL 上下文,这正是导致 libcurl 无法做到这一点的原因。我收到以下错误消息:

curl_easy_perform failed: Out of memory

在我的例子中,我使用的是libmicrohttpd,我用它来初始化

mhdDaemon = MHD_start_daemon(MHD_USE_THREAD_PER_CONNECTION | MHD_USE_SSL,
                               htons(port),
                               NULL,
                               NULL,
                               connectionTreat,                     NULL,
                               MHD_OPTION_HTTPS_MEM_KEY,            httpsKey,
                               MHD_OPTION_HTTPS_MEM_CERT,           httpsCertificate,
                               MHD_OPTION_CONNECTION_MEMORY_LIMIT,  memoryLimit,
                               MHD_OPTION_SOCK_ADDR,                (struct sockaddr*) &sad,
                               MHD_OPTION_NOTIFY_COMPLETED,         requestCompleted, NULL,
                               MHD_OPTION_END);

所以我确实在其他地方使用了 openSSL。问题是,如果我取出 MHD_USE_SSL 部分,它并不能解决问题。

这是链接到应用程序的库列表(我正在使用 cmake):

-lmicrohttpd
-lmongoclient
-lboost_thread
-lboost_filesystem
-lboost_system
-lpthread

还有其他可以加载 SSL 的吗?即使我注释掉 MHD_USE_SSL 标志(以及所有其他相关标志),microhttpd 是否仍然会加载它?这个错误还有其他原因吗?

【问题讨论】:

  • 我在将 Curl 和 OpenSSL 与其他也使用 OpenSSL 的库结合使用时没有遇到问题。

标签: c++ ssl libcurl


【解决方案1】:

我不知道 libcurl 中的 任何 问题,如果内存分配函数确实没有失败,会导致返回此错误代码。在多个模块中使用 OpenSSL 不会导致此类故障。 (我是 libcurl 的首席开发人员。)

所以,在 VERBOSE 设置为 libcurl 的情况下运行您的应用程序,甚至可以使用 strace 来查看哪个系统调用失败,它应该会为您提供更多线索。

【讨论】:

  • 感谢您的指点,我能够找到解决方案。在其他库使用它之前,我只需要使用 SSL_library_init() 初始化 openSSL 库。
【解决方案2】:

正如this answer 中所述,如果您使用的是 Ubuntu 16.04,则可能需要禁用 SSLv3

curl_easy_setopt(curl_, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2));

出于安全原因,它在 Ubuntu 16.04 上被禁用,请参阅更多 here

【讨论】:

    猜你喜欢
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多