Я недавно обновился до 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
.