Libcurl перестает работать, ошибка подключения SSL

Я работаю над программой для личного использования, которая периодически очищает несколько веб-страниц. Один из них требует использования SSL, и его основной URL-адрес на самом деле является балансировщиком нагрузки, который каждый раз перенаправляется в другой домен из списка нескольких (не уверен, что это актуально). Я довольно новичок в libcurl и SSL, в частности, поэтому я могу пропустить что-то очевидное, но я так не думаю.

программа работает нормально некоторое время (до сих пор, не более часа), но как только она получает ошибка подключения SSL в первый раз, он будет продолжать давать ту же ошибку каждый раз. Это всегда разное количество времени и разное количество успешных запросов, прежде чем он начинает проваливаться.

буфер ошибок всегда содержит следующее:schannel: next InitializeSecurityContext failed: SEC_E_ILLEGAL_MESSAGE (0x80090326) - This error usually occurs when a fatal SSL/TLS alert is received (e.g. handshake failed). More detail may be available in the Windows System event log.

нет ничего полезного в eventvwr. Поиск по этому коду ошибки возвращает результаты о проблемах с самозаверяющими сертификатами в более ранних версиях Windows Server, но мало что еще. Я не контролирую сервер Я подключаюсь, но я сомневаюсь, что это окно.

у меня закончились идеи здесь, поэтому я просто собираюсь дать любые детали, которые могут быть актуальными. Я не могу опубликовать какой-либо фактический исходный код, потому что я абстрагировал все вызовы curl в нескольких классах, поэтому мне пришлось бы вставить много шаблонного кода, прежде чем другие могли бы понять его. Я подтвердил с помощью отладчика Visual Studio, что это то, к чему сводятся фактические вызовы.

Я инициализирую libcurl в основном потоке, прежде чем будут созданы другие, например:curl_global_init(CURL_GLOBAL_WIN32 | CURL_GLOBAL_SSL);

затем я создаю и инициализирую фактический дескриптор завитка во втором потоке, и только в этом потоке, например:

m_handle = curl_easy_init();
curl_easy_setopt(m_handle, CURLOPT_WRITEDATA, this);
curl_easy_setopt(m_handle, CURLOPT_WRITEFUNCTION, write);
curl_easy_setopt(m_handle, CURLOPT_DEBUGDATA, this);
curl_easy_setopt(m_handle, CURLOPT_DEBUGFUNCTION, debug);
curl_easy_setopt(m_handle, CURLOPT_VERBOSE, 1);
curl_easy_setopt(m_handle, CURLOPT_ERRORBUFFER, &m_errormsg[0]);
curl_easy_setopt(m_handle, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(m_handle, CURLOPT_COOKIEFILE, "");

я экспериментировал с настройкой как CURLOPT_SSL_VERIFYHOST и CURLOPT_SSL_VERIFYPEER к 0, но это не помогло.

Я построил libcurl из curl-7.43.0.tar.gz С nmake /f Makefile.vc mode=static VC=12 ENABLE_WINSSL=yes ENABLE_SSPI=yes MACHINE=x64 DEBUG=yes в Visual Studio 2013.

что здесь происходит и как я могу это исправить?

2 ответов


Я собираюсь догадаться, что вы используете один дескриптор завитка для всех ваших запросов (так как вы говорите: "Я создаю и инициализирую на фактическая ручка скручиваемости"). Решение, скорее всего, создаст один дескриптор CURL для каждого запроса, выполненного с помощью curl_easy_perform (), а затем curl_easy_cleanup() немедленно.

то, что вы видите, вероятно, вызвано отключением сервера SSL-соединения. Но ваша ручка CURL, вероятно, сохраняет свое состояние как есть (т. е. с рукопожатием completed), который больше не подходит.


CURL *handle = curl_easy_init();
char url[] = "https://google.com";
curl_easy_setopt(handle, CURLOPT_URL, url);
curl_easy_perform(handle);

должны работать...