2015-09-01 26 views
8

Pracuję nad programem do użytku osobistego, który okresowo skasuje kilka stron. Jeden z nich wymaga użycia protokołu SSL, a jego głównym adresem URL jest w rzeczywistości równoważnik obciążenia, który za każdym razem przekierowuje do innej domeny z listy kilku (nie wiem, czy jest to istotne). Jestem całkiem nowy w libcurl i SSL, więc może brakuje mi czegoś oczywistego, ale nie sądzę.Libcurl przestaje działać, błąd połączenia SSL

Program działa dobrze przez pewien czas (jak dotąd, nigdy nie dłużej niż godzina), ale gdy po raz pierwszy otrzyma błąd połączenia SSL, będzie ciągle podawał ten sam błąd za każdym razem. To zawsze inna ilość czasu i inna liczba udanych próśb, zanim zacznie się nie udać.

Bufor błąd zawsze zawiera następujące elementy: 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.

Nic przydatna w eventvwr. Wyszukiwania tego kodu błędu zwracają wyniki dotyczące problemów z samopodpisanymi certyfikatami we wcześniejszych wersjach systemu Windows Server, ale niewiele więcej. Nie kontroluję serwera, z którym się łączę, ale wątpię, by był to system Windows.

Tutaj zabrakło pomysłów, więc zamierzam podać wszystkie szczegóły, które mogą być istotne. Naprawdę nie mogę opublikować żadnego rzeczywistego kodu źródłowego, ponieważ wyodrębniłem wszystkie odwołania do curl w kilku klasach, więc musiałbym wkleić dużo kodu standardowego, zanim inni mogliby to zrozumieć. Potwierdziłem przy użyciu debugera Visual Studio, że do tego właśnie służą rzeczywiste połączenia.

zainicjować libCurl w głównym wątku, zanim jakiekolwiek inne są tworzone, jak w przykładzie: curl_global_init(CURL_GLOBAL_WIN32 | CURL_GLOBAL_SSL);

Następnie tworzę i zainicjować rzeczywiste uchwyt curl w drugim wątku, i tylko w tym wątku, tak jak poniżej:

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, ""); 

mam eksperymentował z ustawieniem zarówno CURLOPT_SSL_VERIFYHOST i CURLOPT_SSL_VERIFYPEER do 0, ale to nie pomogło.

Zbudowałem libCurl z curl-7.43.0.tar.gz z nmake /f Makefile.vc mode=static VC=12 ENABLE_WINSSL=yes ENABLE_SSPI=yes MACHINE=x64 DEBUG=yes w Visual Studio 2013.

Co tu się dzieje i jak można to naprawić?

Odpowiedz

4

Idę się domyślić, że jesteś przy użyciu pojedynczego uchwytu CURL dla wszystkich wniosków (ponieważ mówisz „tworzę i zainicjować się rzeczywiste uchwyt curl "). Rozwiązanie najprawdopodobniej utworzy jeden uchwyt CURL na każde żądanie wykonane za pomocą curl_easy_perform(), a następnie curl_easy_cleanup().

To, co widzisz, jest prawdopodobnie spowodowane wyłączeniem serwera przez połączenie SSL. Ale Twój uchwyt CURL prawdopodobnie zachowuje swój stan (np. Z zakończonym handshake), co nie jest już właściwe.

+0

Na razie zaznaczam to jako odpowiedź, ponieważ nagroda kończy się za kilka godzin, ale nie mam czasu na testy teraz. – Jehjoa

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

powinno działać ...

+0

Jestem pewien, że tak, ale nie o to pytam ... – Jehjoa