osx 10.10 Curl POST to HTTPS url gives SSLRead () error

Niedawno uaktualniłem do OSX 10.10 Yosemite i od aktualizacji nie mogę już robić Curl posta na URL SSL.

Po raz pierwszy użyłem wywołania WordPressa wp_remote_request, a także próbowałem użyć curl w php. Oba (zgodnie z oczekiwaniami) dają ten sam komunikat o błędzie:

W Tym Celu Prosimy O Kontakt.]}

Error String: SSLRead () return error -9806

Uwaga: kiedy curl POST do HTTP działa dobrze. Myślę, że jest to ustawienie w PHP.ini lub w moim apache (zgubiłem mój oryginalny HTTPD.plik conf po aktualizacji...).

Czy ktoś może mi pomóc?
Author: Asaph, 2014-10-20

3 answers

Widziałem ten błąd, gdy php jest skompilowany z wersją cURL, która używa bezpiecznego transportu Apple pod Yosemite i cel żądania adresu URL nie obsługuje SSLv3(który prawdopodobnie został wyłączony z powodu luki POODLE). Jakie jest wyjście tego polecenia?

$ php -i | grep "SSL Version"

Podejrzewam, że zobaczysz to:

SSL Version => SecureTransport

Możesz to przezwyciężyć instalując wersję php, która używa wersji cURL, która używa OpenSSL zamiast SecureTransport. Najłatwiej jest to zrobić z homebrew. Więc zainstaluj to najpierw, jeśli jeszcze go nie masz. Jeśli homebrew jest zainstalowany, ale nie uruchomiłeś brew update od aktualizacji do Yosemite, zrób to najpierw. Upewnij się również, że zainstalowałeś XCode >= 6.1 i najnowsze narzędzia wiersza poleceń XCode. brew doctor powie Ci, czy zrobiłeś to dobrze.

Dodaj Homebrew taps poniżej, które będą potrzebne do zainstalowania php. Pomiń ten krok, jeśli te transakcje repo są już na podsłuchu. Jeśli nie masz pewności, czy te repozytoria są już uruchomione, po prostu uruchom poniższe polecenia. W najgorszym przypadku dostaniesz nieszkodliwe Warning: Already tapped!

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

Następnie zainstaluj curl za pomocą openssl:

$ brew install --with-openssl curl

Następnie zainstaluj php używając curla, który właśnie zainstalowałeś i zaparzyłeś openssl:

$ brew install --with-homebrew-curl --with-httpd24 php55
  • Jeśli używasz apache 'a, dodaj LoadModule php5_module /usr/local/opt/php55/libexec/apache2/libphp5.so do swojego /etc/apache2/httpd.conf i uruchom ponownie apache' a.

  • Jeśli nie używasz apache 2.4, możesz usunąć --with-httpd24 z powyższego dowództwo.

  • Jeśli używasz nginx, postępuj zgodnie z instrukcjami dotyczącymi uruchamiania fpm:]}

    Aby uruchomić php-fpm przy starcie:

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

Zainstaluj dowolne rozszerzenia php, których będziesz potrzebować np. mcrypt.

$ brew install php55-mcrypt

Gdy skończysz, uruchom to jeszcze raz:

$ php -i | grep "SSL Version"

I powinieneś zobaczyć:

SSL Version => OpenSSL/1.0.2h

A teraz ponownie przetestuj swoją aplikację i SSLRead() return error -9806 powinno zniknąć.

 142
Author: Asaph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 05:00:05

Ten błąd SSL (Kod OSStatus: 9806) oznacza, że Twoje połączenie zostanie przerwane przez serwer z powodu błędu w nawiązaniu połączenia (np. przy jakiejś nieprawidłowej komendzie). Wydaje się, że dzieje się tak tylko wtedy, gdy połączenie SSL ze zdalnym hostem spada pomiędzy.

Nie jest to dobrze udokumentowane przez podręcznik SSL (SSL_get_error), jednak ten Komunikat o błędzie pochodzi z libcurl built, który jest używany przez backend SecureTransport / Darwinssl TLS (jego status można znaleźć w nagłówku SecureTransport.h plik):

errSSLClosedAbort           = -9806,    /* connection closed via error */

Z mojego doświadczenia wynika, że zwykle dzieje się tak, gdy jesteś za proxy lub podłączony do ograniczonej sieci, która wykorzystuje mechanizm uwierzytelniania.

Więc proszę sprawdzić, czy jesteś podłączony do odpowiedniej sieci (przez WiFi) i inne HTTPS działa poprawnie. Jeśli nie, sprawdź, czy musisz podać dane uwierzytelniające serwera proxy lub czy dostawca usług internetowych nadpisuje łańcuch certyfikatów i wymaga pewnego rodzaju uwierzytelnienia lub zasadniczo blokuje dostęp do niektórych witryn w ich firewall.

 5
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-18 15:14:58

Miałem podobny problem z błędem SSLRead() return error -9806, a także miałem SSL Version => SecureTransport.

Ale w moim przypadku problem polegał na tym, że ustawiałem opcję curl CURLOPT_HTTP_VERSION:

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

Jeśli usuniesz tę opcję, cURL zdecyduje, której wersji użyć domyślnie. Sprawdź dokumentację curl_setopt , aby uzyskać więcej informacji.

To zadziałało dla mnie i nie musiałem niczego zmieniać za pomocą cURL ani PHP. Ale jest to rozwiązanie jednego z wielu przypadków, w których pojawia się error -9806.

 1
Author: Daniel Batalla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 16:02:24