Инициализация SSL и libcurl и "нехватка памяти"
Я намереваюсь делать запросы https с помощью libcurl и openssl с программой на C++.
Я инициализировал libcurl с curl_global_init(CURL_GLOBAL_ALL)
как описано в документации. Тогда я использую curl_easy
обработайте то, что я инициализирую, заполните заголовками и телом и отправьте все по адресу " https://example.com/foo ". Это работает для не-https подключений.
Оглядываясь вокруг, я обнаруживаю, что могут быть другие библиотеки, которые уже получают контекст 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? Microhttpd загружает его в любом случае, даже если я закомментирую MHD_USE_SSL
флаг (плюс все другие связанные флаги)? Может ли быть какая-либо другая причина для этой ошибки?
2 ответа
Я не знаю ни одной проблемы в libcurl, которая могла бы привести к тому, что этот код ошибки будет возвращен, если действительно функция выделения памяти не даст сбой. Использование OpenSSL в нескольких модулях не приводит к такой ошибке. (Я ведущий разработчик libcurl.)
Итак, запустите ваше приложение с VERBOSE, установленным на libcurl, или даже прямо, чтобы увидеть, какой системный вызов потерпит неудачу, и он должен дать вам больше подсказок.
Как описано в этом ответе, вам может потребоваться отключить SSLv3, если вы работаете в Ubuntu 16.04 примерно так
curl_easy_setopt(curl_, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2));
Он был отключен в Ubuntu 16.04 по соображениям безопасности, подробнее см. Здесь.