Я недавно обновился до OSX 10.10 Yosemite, и после обновления я больше не могу делать Curl POST для URL-адреса SSL.
Я впервые использовал WordPress wp_remote_request
позвоните, а также попытался использовать curl в php.
Оба (как и ожидалось) выдают одно и то же сообщение об ошибке:
Номер ошибки: 56
Строка ошибки: SSLRead () возвращает ошибку -9806
Примечание: когда я завожу POST в HTTP, он работает нормально.
Я считаю, что это настройка в PHP.ini или в моем apache (я потерял свой оригинальный файл HTTPD.conf после обновления …).
Может кто-нибудь мне помочь?
Я видел эту ошибку, когда 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
должен уйти.
Эта ошибка SSL (код OSStatus: 9806) означает, что ваше соединение прерывается сервером из-за ошибки в установлении соединения (например, по какой-то недопустимой команде). Похоже, это происходит только в тех случаях, когда соединение SSL с удаленным хостом прерывается между ними.
Это плохо документировано в руководстве по SSL (SSL_get_error
), однако это сообщение об ошибке исходит от libcurl
встроенный, который используется TLS-сервером SecureTransport / Darwinssl (его OSStatus можно найти в SecureTransport.h
заголовочный файл):
errSSLClosedAbort = -9806, /* connection closed via error */
По моему опыту, это обычно происходит, когда вы находитесь за прокси-сервером или подключены к ограниченной сети, которая использует механизм аутентификации.
Поэтому, пожалуйста, убедитесь, что вы подключены к правильной сети (через WiFi) и ваш другой HTTPS работает правильно. Если нет, проверьте, нужно ли указывать учетные данные прокси-сервера, или ваш провайдер переопределяет цепочку сертификатов и требует какой-либо проверки подлинности, или он в основном блокирует доступ к определенным сайтам в их брандмауэре.
У меня была похожая проблема с 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
появляется.