osx 10.10 Curl POST zu HTTPS-URL gibt SSLRead () Fehler aus


72

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_requestAnruf 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?


5
warum abstimmen ??? Es ist ein echtes Problem, das ich habe und kann keine gute Lösung in Google finden
Mattijs

1
Sie haben wahrscheinlich die Ablehnung erhalten, denn obwohl dies eine völlig vernünftige Frage ist, ist sie für SO kein Thema - sie sollte wirklich auf Serverfault sein.
Synchro

12
Zur Verteidigung von Mattijs codiert er einen Anruf 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 ServerFault
Kirby

1
Danke Kumpel. Genau so habe ich es beabsichtigt.
Mattijs

1
@Mattijs Ich habe diese Fehler auch auf meinem 2017 MBP erhalten. Die gleiche Lösung hat auch bei mir funktioniert.
Mischka

Antworten:


142

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:

SSL Version => SecureTransport

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 updateseit 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 doctorIch 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 harmloseWarning: Already tapped!

$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/php

Dann installieren Sie curl mit openssl:

$ brew install --with-openssl curl

Dann installiere PHP mit der Curl, die du gerade installiert und gebraut hast.

$ brew install --with-homebrew-curl --with-httpd24 php55
  • Wenn Sie Apache verwenden, stellen Sie sicher, dass LoadModule php5_module /usr/local/opt/php55/libexec/apache2/libphp5.soSie /etc/apache2/httpd.confApache hinzufügen und neu starten.

  • Wenn Sie Apache 2.4 nicht verwenden, können Sie es --with-httpd24aus dem obigen Befehl entfernen .

  • Wenn Sie Nginx verwenden, befolgen Sie die Anweisungen zum Starten von fpm:

    So starten Sie php-fpm beim Start:

    mkdir -p ~/Library/LaunchAgents
    cp /usr/local/opt/php55/homebrew.mxcl.php55.plist ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php55.plist
    

Installieren Sie alle PHP-Erweiterungen, die Sie benötigen, z. mcrypt.

$ brew install php55-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 -9806sollte verschwinden.


2
Hallo Asaph, ja, ich habe SSL Version => SecureTransport. Ich habe Brew und frage mich nur, ob die Installation mit Brew mein aktuelles PHP überschreibt oder ob eine weitere PHP-Version hinzugefügt wird, sodass ich die Standardversion deaktivieren muss. Vielen Dank auch für Ihre gründliche Antwort. Ich hätte es selbst nicht herausgefunden, um ein Problem zu konkretisieren
Mattijs

Dies ist die OpenSSL-Info, die ich erhalten habe: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)
Mattijs

1
Hallo Asaph, ich habe die BREW PHP-Version installiert, alles ging gut, nachdem ich den Vorschlägen des Brauarztes gefolgt war. Der SSL-Aufruf funktioniert jetzt mit PHP (WordPress wp_remote_request). Wenn ich mich jedoch im Terminal auf den gleichen Punkt bewege, sehe ich wieder den -9806 : * 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?
Mattijs

1
Ich musste den brew tapAnweisungen unter (Neu-) Installation von PHP unter Mac OS X folgen, bevor ich es ausführen konnte brew install php55, aber ansonsten war diese Antwort solide.

1
@ Tony Sie können Apples Version von PHP neu kompilieren, aber das scheint invasiver zu sein. Das Schöne an Homebrew ist, dass es alles installiert /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.
Asaph

5

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 von libcurlbuilt, das vom SecureTransport / Darwinssl-TLS-Backend verwendet wird (den OSStatus finden Sie in der SecureTransport.hHeader-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.


1

Ich hatte ein ähnliches Problem mit dem SSLRead() return error -9806Fehler, und ich hatte es auch SSL Version => SecureTransport.

In meinem Fall bestand das Problem jedoch darin, dass ich die Curl- CURLOPT_HTTP_VERSIONOption festlegte :

$curl = curl_init();    
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);

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 -9806auftritt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.