初始化 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。
我打算用 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 查看哪个系统调用失败,它应该会为您提供更多线索。
如
curl_easy_setopt(curl_, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2));
出于安全原因,它在 Ubuntu 16.04 上被禁用,查看更多 here。