Инициализация 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 по соображениям безопасности, подробнее см. Здесь.

Другие вопросы по тегам