初始化SSL和libcurl并获得"内存不足"

时间:2015-01-20 15:17:01

标签: c++ ssl libcurl

我打算用libcurl和openssl用C ++程序做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仍会加载它吗?这个错误可能还有其他原因吗?

2 个答案:

答案 0 :(得分:2)

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

因此,运行你的应用程序,将VERBOSE设置为libcurl,甚至strace以查看哪个系统调用失败,它应该为你提供更多线索。

答案 1 :(得分:0)

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

curl_easy_setopt(curl_, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2));

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