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);
должны работать...