Intereting Posts
Удалите пространство имен форм в форме Symfony2 (для REST API) Laravel – Как использовать класс поставщика? Как создать функцию в PHP, которая сортирует массив на основе одного из его ключей Конструктор запросов базы данных иногда возвращает массив вместо объекта, запущенного как задание в очереди Оптимизация географического центра в Картах Google в отношении времени поездки, если он находится внутри воды Проверка орфографии и предложение правильного слова в PHP Красноречивые коллекции: каждый против foreach Очистка / дезинфекция атрибутов xpath Инструмент для добавления и завершения документации исходного кода PHP как получить ДЕНЬ, отсутствующую в рабочие дни с данного диапазона дат? Как получить содержимое страницы с помощью cURL? Curl и pcntl_fork () Многопоточность в PHP Как реализовать прослушивание событий в PHP Мобильная версия сайта с использованием CodeIgniter

Curl POST to HTTPS url дает ошибку SSLRead ()

Я недавно обновился до OSX 10.10. Yosemite и я с момента обновления не могу больше использовать Curl POST для SSL-url.

Сначала я использовал вызов wp_remote_request wordpress, а также попытался использовать curl в php. Оба (как и ожидалось) дают одно и то же сообщение об ошибке:

Номер ошибки: 56

Строка ошибки: ошибка возврата SSLRead () -9806

Примечание: когда я скручиваю POST на HTTP, он работает нормально. Я считаю, что это настройка в PHP.ini или в моем apache (после обновления я потерял свой исходный файл HTTPD.conf …).

Может кто-нибудь мне помочь?

Я видел, что эта ошибка возникает, когда php скомпилирован с версией cURL, использующей безопасный транспорт Apple под Yosemite, и цель запроса URL-адреса не поддерживает SSLv3 (который, вероятно, был отключен из-за уязвимости POODLE ). Каков результат этой команды?

 $ php -i | grep "SSL Version" 

Я подозреваю, что вы увидите следующее:

 SSL Version => SecureTransport 

Вы можете преодолеть это, установив версию php, которая использует версию cURL, которая использует OpenSSL вместо SecureTransport. Это проще всего сделать с доморощенным . Поэтому сначала установите это, если у вас его еще нет. Если homebrew установлен, но вы не запустили brew update с момента обновления до Yosemite, сделайте это первым. Также убедитесь, что вы установили XCode> = 6.1 и новейшие инструменты командной строки XCode. brew doctor скажет вам, все ли вы сделали все правильно.

Добавьте метки Homebrew ниже, которые вам понадобятся, чтобы установить установленный php. Пропустите этот шаг, если эти репозитории уже прослушиваются. Если вы не уверены, что эти репозитории уже используются, просто запустите приведенные ниже команды. В худшем случае, вы получите безобидное Warning: Already tapped!

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

Затем установите curl с помощью openssl:

 $ brew install --with-openssl curl 

Затем установите php, используя завиток, который вы только что установили, и заварили openssl:

 $ brew install --with-homebrew-curl --with-httpd24 php55 
  • если вы используете apache, обязательно добавьте LoadModule php5_module /usr/local/opt/php55/libexec/apache2/libphp5.so к вашему /etc/apache2/httpd.conf и перезапустите apache.

  • если не использовать apache 2.4, вы можете удалить --with-httpd24 из приведенной выше команды.

  • если вы используете nginx, следуйте инструкциям по обходам для начала fpm:

    Чтобы запустить php-fpm при запуске:

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

Установите любые расширения php, которые вам понадобятся, например. mcrypt .

 $ brew install php55-mcrypt 

После того, как вы закончите, запустите это снова:

 $ php -i | grep "SSL Version" 

И вы должны увидеть:

 SSL Version => OpenSSL/1.0.2h 

И теперь повторите проверку своего приложения, и SSLRead() return error -9806 должна исчезнуть.

Эта ошибка SSL (код OSStatus: 9806) означает, что ваше соединение завершено сервером из-за ошибки при установлении соединения (например, при некорректной команде). Это происходит, случается, только в случаях, когда соединение SSL с удаленным хостом падает между ними.

Это плохо документировано руководством SSL ( SSL_get_error ), однако это сообщение об ошибке происходит из созданного libcurl который используется защищенным сервером SecureTransport / Darwinssl TLS (вы можете найти его OSStatus в SecureTransport.h заголовка SecureTransport.h ):

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

По моему опыту это обычно происходит, когда вы находитесь за прокси-сервером или подключаетесь к ограниченной сети, использующей механизм аутентификации.

Поэтому убедитесь, что вы подключены к правильной сети (через WiFi), и ваш другой HTTPS работает правильно. Если нет, проверьте, нужно ли указывать учетные данные прокси-сервера или ваш интернет-провайдер переопределяет цепочку сертификатов и требует какой-либо проверки подлинности или в основном блокирует доступ к определенным сайтам в своем брандмауэре.

У меня была аналогичная проблема с SSLRead() return error -9806 ошибки SSLRead() return error -9806 , а также у меня была SSL Version => SecureTransport .

Но в моем случае проблема заключалась в том, что я устанавливал параметр curl CURLOPT_HTTP_VERSION :

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

Если вы удалите этот параметр, cURL определит, какую версию использовать по умолчанию. Проверьте документацию curl_setopt для получения дополнительной информации.

Это сработало для меня, и мне не нужно ничего менять с помощью cURL и PHP. Но это решение одного из многих случаев, когда появляется error -9806 .