Ich arbeite an einem Programm für den persönlichen Gebrauch, das in regelmäßigen Abständen einige Webseiten scrapt. 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.
Das Programm funktioniert eine Weile (bis jetzt, niemals 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 von erfolgreichen Anfragen, bevor sie fehlschlägt.
Der Fehlerpuffer enthält immer Folgendes: 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.
In eventvwr
gibt es nichts Nützliches. 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 werde ich nur Details angeben, 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, obwohl.
Ich initialisiere libcurl im Hauptthread, bevor irgendwelche anderen erstellt werden: curl_global_init(CURL_GLOBAL_WIN32 | CURL_GLOBAL_SSL);
Dann erstelle und initialisiere ich das eigentliche Curl-Handle in einem zweiten Thread und nur in diesem Thread, so:
%Vor% Ich habe versucht, CURLOPT_SSL_VERIFYHOST
und CURLOPT_SSL_VERIFYPEER
auf 0 zu setzen, aber das hat nicht geholfen.
Ich habe 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
in Visual Studio 2013 erstellt.
Was ist hier los und wie kann ich es beheben?
Ich nehme an, dass Sie ein einziges CURL-Handle für alle Ihre Anfragen verwenden (da Sie sagen "Ich erstelle und initialisiere das tatsächliche Curl-Handle"). 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 () durchgefü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.