初始化 SSL 和 libcurl 并获取 "out of memory"

Initializing SSL and libcurl and getting "out of memory"

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

我按照文档中的描述使用 curl_global_init(CURL_GLOBAL_ALL) 初始化了 libcurl。然后我使用我初始化的 curl_easy 句柄,填充 headers 和 body,并将所有内容发送到“https://example.com:443/foo”。它适用于 non-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 是否仍然加载它?这个错误还有其他原因吗?

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

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

中所述,如果您使用 Ubuntu 16.04,您可能需要禁用 SSLv3

curl_easy_setopt(curl_, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2));

出于安全原因,它在 Ubuntu 16.04 上被禁用,查看更多 here