OSX 10.10 Curl POST для HTTPS URL дает ошибку SSLRead ()

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

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

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

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

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

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

71

Решение

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

$ php -i | grep "SSL Version"

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

SSL Version => SecureTransport

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

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

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

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

$ brew install --with-openssl curl

Затем установите php, используя только что установленный вами curl и варивший 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, следуйте инструкциям caveat для запуска 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 должен уйти.

142

Другие решения

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

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

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

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

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

5

У меня была похожая проблема с 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 появляется.

1
По вопросам рекламы [email protected]