Ich habe kürzlich ein Upgrade auf OSX 10.10 Yosemite durchgeführt und seit dem Upgrade kann ich Curl POST nicht mehr auf eine SSL-URL durchführen.
Ich habe zuerst den wp_remote_request
Anruf von WordPress verwendet und auch versucht, Curl in PHP zu verwenden. Beide geben (wie erwartet) dieselbe Fehlermeldung aus:
Fehlernummer: 56
Fehlerzeichenfolge: SSLRead () gibt den Fehler -9806 zurück
Hinweis: Wenn ich POST auf HTTP locke, funktioniert es einwandfrei. Ich gehe davon aus, dass es sich um eine Einstellung in PHP.ini oder in meinem Apache handelt (ich habe meine ursprüngliche HTTPD.conf-Datei nach dem Upgrade verloren ...).
Kann mir jemand helfen?
wp_remote_request()
in PHP, der auf cURL darunter beruht. Ich denke, dass es gültig ist, dass er nach SO fragt, da sein proximales Problem mit der Codierung begann. Erst nachdem er die Antwort wusste, konnte er wissen, dass die Frage auf ServerFaultAntworten:
Ich habe diesen Fehler gesehen, als PHP mit einer Version von cURL kompiliert wurde, die Apples Secure Transport unter Yosemite verwendet und das Ziel der URL-Anfrage SSLv3 nicht unterstützt (was wahrscheinlich aufgrund der POODLE-Sicherheitsanfälligkeit deaktiviert wurde ). Was ist die Ausgabe dieses Befehls?
$ php -i | grep "SSL Version"
Ich vermute, Sie werden das sehen:
Sie können dies überwinden, indem Sie eine Version von PHP installieren, die eine Version von cURL verwendet, die OpenSSL anstelle von SecureTransport verwendet. Dies ist am einfachsten mit Homebrew zu tun . Installieren Sie das also zuerst, wenn Sie es noch nicht haben. Wenn Homebrew installiert ist, Sie aber
brew update
seit dem Upgrade auf Yosemite nicht mehr ausgeführt haben , tun Sie dies zuerst. Stellen Sie außerdem sicher, dass Sie XCode> = 6.1 und die neuesten XCode-Befehlszeilentools installiert haben.brew doctor
Ich werde Ihnen sagen, ob Sie alles richtig gemacht haben.Fügen Sie die Homebrew-Taps hinzu, die Sie benötigen, um gebrautes PHP zu installieren. Überspringen Sie diesen Schritt, wenn diese Repos bereits getippt sind. Wenn Sie nicht sicher sind, ob diese Repos bereits getippt sind, führen Sie einfach die folgenden Befehle aus. Im schlimmsten Fall erhalten Sie eine harmlose
Warning: Already tapped!
Dann installieren Sie curl mit openssl:
Dann installiere PHP mit der Curl, die du gerade installiert und gebraut hast.
Wenn Sie Apache verwenden, stellen Sie sicher, dass
LoadModule php5_module /usr/local/opt/php55/libexec/apache2/libphp5.so
Sie/etc/apache2/httpd.conf
Apache hinzufügen und neu starten.Wenn Sie Apache 2.4 nicht verwenden, können Sie es
--with-httpd24
aus dem obigen Befehl entfernen .Wenn Sie Nginx verwenden, befolgen Sie die Anweisungen zum Starten von fpm:
Installieren Sie alle PHP-Erweiterungen, die Sie benötigen, z.
mcrypt
.Nachdem Sie fertig sind, führen Sie dies erneut aus:
$ php -i | grep "SSL Version"
Und du solltest sehen:
SSL Version => OpenSSL/1.0.2h
Und jetzt testen Sie Ihre Anwendung erneut und die
SSLRead() return error -9806
sollte verschwinden.quelle
New, TLSv1/SSLv3, Cipher is RC4-MD5 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1 Cipher : RC4-MD5 Session-ID: 0B220000E93AF2E279F784D25D6FC08675E63F983424A4296BEBE59AF89F3E7C Session-ID-ctx: Master-Key: 4B0BFE2ECC5624D0E3A2AD44FF6DC30F25E0C4889C6CA5EF0D0E90C1469D70C9D6B5321A4B2C1A084355A79A013C4420 Key-Arg : None Start Time: 1414123290 Timeout : 300 (sec) Verify return code: 0 (ok)
* SSLRead() return error -9806 * Closing connection 0 curl: (56) SSLRead() return error -9806
. Wenn ich php -i mache, sehe ich, dass die Brew-Version läuft, weil das Erstellungsdatum gestern war. Kann es sein, dass die Kommandozeilen-Curl die alte und nicht die neue ist, die ich gestern gebraut habe?brew tap
Anweisungen unter (Neu-) Installation von PHP unter Mac OS X folgen, bevor ich es ausführen konntebrew install php55
, aber ansonsten war diese Antwort solide./usr/local
(was OSX nicht berührt) und Binärdateien "überschreibt"/usr
. Wenn Sie sich also eines Tages entscheiden, wieder die Apple-Version von PHP zu verwenden, entfernen Sie einfach die von Homebrew installierte und Ihr System kehrt zu dem zurück, was es zuvor war.Dieser SSL-Fehler (OSStatus-Code: 9806) bedeutet, dass Ihre Verbindung vom Server aufgrund eines Fehlers beim Herstellen der Verbindung beendet wird (z. B. bei einem ungültigen Befehl). Dies scheint nur gelegentlich zu passieren, wenn die SSL-Verbindung zum Remote-Host dazwischen unterbrochen wird.
Dies ist im SSL-Handbuch (
SSL_get_error
) nicht gut dokumentiert. Diese Fehlermeldung stammt jedoch vonlibcurl
built, das vom SecureTransport / Darwinssl-TLS-Backend verwendet wird (den OSStatus finden Sie in derSecureTransport.h
Header-Datei):errSSLClosedAbort = -9806, /* connection closed via error */
Nach meiner Erfahrung geschieht dies normalerweise, wenn Sie sich hinter dem Proxy befinden oder mit einem begrenzten Netzwerk verbunden sind, das einen Authentifizierungsmechanismus verwendet.
Stellen Sie daher sicher, dass Sie mit dem richtigen Netzwerk (über WLAN) verbunden sind und Ihr anderes HTTPS ordnungsgemäß funktioniert. Wenn nicht, überprüfen Sie, ob Sie Proxy-Anmeldeinformationen angeben müssen oder Ihr ISP die Zertifikatkette überschreibt und eine Authentifizierung erfordert oder den Zugriff auf bestimmte Sites in der Firewall blockiert.
quelle
Ich hatte ein ähnliches Problem mit dem
SSLRead() return error -9806
Fehler, und ich hatte es auchSSL Version => SecureTransport
.In meinem Fall bestand das Problem jedoch darin, dass ich die Curl-
CURLOPT_HTTP_VERSION
Option festlegte :Wenn Sie diese Option entfernen, entscheidet cURL, welche Version standardmäßig verwendet wird. Prüfen curl_setopt Dokumentation für mehr.
Das hat bei mir funktioniert und ich musste weder mit cURL noch mit PHP etwas ändern. Dies ist jedoch eine Lösung für einen von vielen Fällen, in denen dies
error -9806
auftritt.quelle