我打算用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仍会加载它吗?这个错误可能还有其他原因吗?
答案 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。