2015-09-01 13 views
8

Ich arbeite an einem Programm für den persönlichen Gebrauch, das regelmäßig einige Webseiten scrappt. Einer von ihnen erfordert die Verwendung von SSL und seine Haupt-URL ist eigentlich ein Load-Balancer, der jedes Mal von einer Liste einer Handvoll zu einer anderen Domäne umleitet (nicht sicher, ob dies relevant ist). Ich bin ziemlich neu in libcurl und SSL im Besonderen, damit ich etwas offensichtliches vermisse, aber ich denke nicht.Libcurl funktioniert nicht mehr, SSL connect error

Das Programm funktioniert gut für eine Weile (bisher, nie länger als eine Stunde), aber sobald es zum ersten Mal den SSL-Verbindungsfehler erhält, wird es immer den gleichen Fehler geben. Es ist immer eine andere Zeit und eine andere Anzahl erfolgreicher Anfragen, bevor es zu einem Fehler kommt.

Der Fehlerpuffer enthält immer die folgenden: 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.

Es gibt nichts nützlich in eventvwr. Bei der Suche nach diesem Fehlercode werden Ergebnisse zu Problemen mit selbstsignierten Zertifikaten in früheren Versionen von Windows Server zurückgegeben. Ich kontrolliere nicht den Server, mit dem ich mich verbinde, aber ich bezweifle, dass es eine Windows-Box ist.

Ich habe hier keine Ideen mehr, also gebe ich nur Details, die relevant sein könnten. Ich kann eigentlich keinen Quellcode posten, da ich in mehreren Klassen alle Curl-Aufrufe entfernt habe, so dass ich viel Code einfügen musste, bevor andere einen Sinn daraus machen konnten. Ich habe mit dem Debugger von Visual Studio bestätigt, dass dies die eigentlichen Aufrufe sind.

I initialisieren Libcurl in dem Haupt-Thread, bevor irgendwelche anderen erstellt werden, etwa so: curl_global_init(CURL_GLOBAL_WIN32 | CURL_GLOBAL_SSL);

Dann I erstellen und die tatsächlichen curl Griff in einem zweiten Thread initialisieren, und nur in diesem Thread, etwa so:

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

ich habe mit der Einstellung sowohl CURLOPT_SSL_VERIFYHOST und CURLOPT_SSL_VERIFYPEER-0 experimentiert, aber das hat nicht geholfen.

Ich baute Libcurl von curl-7.43.0.tar.gz mit nmake /f Makefile.vc mode=static VC=12 ENABLE_WINSSL=yes ENABLE_SSPI=yes MACHINE=x64 DEBUG=yes auf Visual Studio 2013

Was hier vor sich geht und wie kann ich es beheben?

Antwort

4

Ich werde erraten, dass Sie einen einzelnen ROTATION Griff für alle Ihre Wünsche verwenden (da Sie sagen: „Ich erstellen und initialisieren die tatsächlichen curl Griff "). Die Lösung wird höchstwahrscheinlich ein CURL-Handle für jede Anforderung erstellen, die mit curl_easy_perform() und dann sofort mit curl_easy_cleanup() ausgeführt wird.

Was Sie sehen, wird wahrscheinlich dadurch verursacht, dass der Server die SSL-Verbindung herunterfährt. Aber Ihr CURL-Handle behält seinen Zustand wahrscheinlich so, wie er ist (d. H. Mit dem Handshake abgeschlossen), was nicht mehr angemessen ist.

+0

Ich markiere dies als die Antwort für jetzt, da das Kopfgeld in ein paar Stunden endet, aber ich habe keine Zeit, richtig zu testen jetzt. – Jehjoa

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

sollte funktionieren ...

+0

Ich bin mir sicher es ist aber das ist nicht das, was ich frage ... – Jehjoa