2010-12-21 6 views
5

Nach der Suche überall, ich kann nicht verstehen, warum cURL Anfragen an einen remote SSL-fähigen Host nur 50% der Zeit in meinem Fall erfolgreich sind. Hier ist die Situation: Ich habe eine Reihe von cURL-Anfragen, die alle an einen HTTPS-Remote-Host in einem einzigen PHP-Skript, das ich mit dem PHP-CLI ausführen, ausgestellt. Gelegentlich, wenn ich das Skript ausführen die Anforderungen erfolgreich ausgeführt, aber aus irgendeinem Grund die meiste Zeit ich es laufen bekomme ich folgende Fehler von Curl:cURL/PHP-Anfrage führt 50% der Zeit aus

* About to connect() to www.virginia.edu port 443 (#0) 
* Trying 128.143.22.36... * connected 
* Connected to www.virginia.edu (128.143.22.36) port 443 (#0) 
* successfully set certificate verify locations: 
* CAfile: none 
    CApath: /etc/ssl/certs 
* error:140943FC:SSL routines:SSL3_READ_BYTES:sslv3 alert bad record mac 
* Closing connection #0 

Wenn ich versuche, wieder ein paar Mal ich das gleiche Ergebnis zu erhalten, Aber nach ein paar Versuchen werden die Anfragen erfolgreich durchgeführt. Wird das Skript danach erneut ausgeführt, führt dies zu einem Fehler, und das Muster wird fortgesetzt. Die Untersuchung des Fehlers "alert bad record mac" hat mir nichts geholfen, und ich zögere, es einem SSL-Problem vorzuwerfen, da das Skript immer noch gelegentlich läuft.

Ich bin auf Ubuntu Server 10.04, mit php5 und php5-curl installiert, sowie die neueste Version von openssl. In Bezug auf cURL-spezifische Optionen ist CURLOPT_SSL_VERIFYPEER auf "false" gesetzt und CURLOPT_TIMEOUT und CURLOPT_CONNECTTIMEOUT sind auf 4 Sekunden festgelegt. Dieses Problem wird noch dadurch verdeutlicht, dass die gleiche Situation auf meinem Mac OS X-Rechner auftritt - die Anfragen durchlaufen nur ~ 50% der Zeit.

+0

Sie könnten Google "Fehler 140943FC" –

+0

glauben Sie mir, ich tat. Ich habe sogar überprüft, dass ich Apache in Prefork MPM im Gegensatz zu Worker-Threads ausgeführt habe, da es offensichtlich einen Fehler gibt, der mit der Worker-Thread-Version zusammenhängt (Prefork wird bereits ausgeführt, so dass es nicht half). – mquinn

+2

Falsche MAC-Adresse bezieht sich nicht auf die MAC-Adresse der Netzwerkschnittstelle. Es bezieht sich auf ein Problem mit dem "Message Authentication Code" –

Antwort

3

Der Remote-Host ist vielleicht kein wirklich einzigartiger Host. Vielleicht ist es eine Art Load-Balancing-Lösung, bei der mehrere Server die eingehenden Anfragen übernehmen. Was mich denken lassen könnte, dass es sich um den 'Mac Fehler' in der Fehlermeldung handelt. Dies könnte bedeuten, dass die MAC-Adresse des Remote-Hosts geändert wurde, während die SSL-Verhandlung noch ausgeführt wurde. Und das könnte erklären, dass Sie manchmal kein Problem haben.

Aber vielleicht nicht :-) SSL-Probleme sind ziemlich schwer zu finden.

Ich verstehe Ihre Antwort auf Prefork MPM vs Worker MPM nicht, wenn Sie PHP im CLI-Modus ausführen, wird Ihr Apache MPM nicht verwendet, Sie verwenden nicht einmal Apache.

+0

guten Punkt, ein Load-Balanced-Remote-Host würde in meiner Situation sinnvoll sein. um zu antworten, entschied ich mich einfach zu blockieren, bis ich eine gültige, nicht-falsche curl-antwort bekommen und von dort gehen kann. Das Beste, was ich jetzt habe. – mquinn

+3

Ich glaube nicht, dass MAC etwas mit einer Netzwerk-MAC-Adresse zu tun hat. Es steht für Message Authentication Code: http://en.wikipedia.org/wiki/Message_authentication_code ... Dies führt mich zu der Schlussfolgerung, dass "remote host mac address" hat nichts mit diesem Problem zu tun und umgekehrt. –

+0

@Charles Oliver Nutter schönen Haken, aber das kann immer noch ein Problem sein mit etwas, das zwischen den Hosts (ssl Cache?) Geteilt werden sollte und das ist nicht. – regilero

1

Sie können diese Option benötigen:

CURLOPT_FORBID_REUSE

einem langen Pass. Setzen Sie den Wert auf 1, um beim nächsten Transfer die Verbindung explizit zu schließen. Normalerweise hält libcurl alle Verbindungen am Leben, wenn eine Übertragung ausgeführt wird, falls eine nachfolgende folgt, die sie wiederverwenden kann. Diese Option sollte mit Vorsicht verwendet werden und nur, wenn Sie verstehen, was sie tut. Setzen Sie den Wert auf 0, damit libcurl die Verbindung für eine spätere Wiederverwendung geöffnet hält (Standardverhalten).

+0

Danke für den Vorschlag, aber es war vergebens. Ich hatte zuvor versucht CURLOPT_FRESH_CONNECT, aber das hat nicht funktioniert, und FORBID_REUSE führte zu dem gleichen alten Verhalten. – mquinn

0

Hatten Sie es versucht? curl_setopt ($ handle, CURLOPT_SSLVERSION, 3);