2014-10-20 3 views
70

Недавно я обновился до OSX 10.10. Yosemite и я с момента обновления не могу больше использовать Curl POST для SSL-url.Curl POST to HTTPS url дает ошибку SSLRead()

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

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

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

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

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

+4

Почему голос? Это реальная проблема, с которой я столкнулся, и не могу найти в Google хорошего решения. – Mattijs

+0

Чтобы уточнить: я скручиваю POST с моего локального MB на внешний HTTPS APi – Mattijs

+1

. Вероятно, вы получили нижний предел, потому что, хотя это вполне разумный вопрос, вне темы для SO - это действительно должно быть на Serverfault. – Synchro

ответ

141

Я видел это ошибка происходит, когда PHP скомпилирован с версией CURL, которая использует Apple's Secure Transport под Йосемити и цель запроса URL не поддерживает SSLv3 (который, вероятно, был отключен из-за POODLE vulnerability). Каков результат этой команды?

$ php -i | grep "SSL Version" 

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

SSL Version => SecureTransport 

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

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

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

Затем установите ротор с 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 в ваш.и перезапустите 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 должен уйти ,

+2

Hi Asaph, Да, у меня есть SSL Version => SecureTransport. У меня есть Brew, просто интересно, если установка с Brew перезапишет мой текущий php или добавит еще одну версию PHP вместе с тем, что я должен отключить версию запаса? Также спасибо за ваш тщательный ответ. Я бы не узнал меня, к конкретным проблемам – Mattijs

+0

это OpenSSL информации я получил: 'Новая, TLSv1/SSLv3, Cipher не RC4-MD5 сервера открытого ключ 2048 битого Secure Повторных переговоры поддерживаются Compression: NONE Расширение: NONE SSL-сессии: Протокол: TLSv1 Шифр: RC4-MD5 Session-ID: 0B220000E93AF2E279F784D25D6FC08675E63F983424A4296BEBE59AF89F3E7C Session-ID-CTX: Master-Key: 4B0BFE2ECC5624D0E3A2AD44FF6DC30F25E0C4889C6CA5EF0D0E90C1469D70C9D6B5321A4B2C1A084355A79A013C4420 Key-Arg: Нет Время начала: 1414123290 Тайм-аут : 300 (с) Проверьте код возврата: 0 (ok) ' – Mattijs

+0

@Mattijs Homebrew устанавливает все программное обеспечение в'/usr/local' и не касается php OSX. Пока '/ usr/local/bin' появляется перед'/usr/bin' в переменной среды '$ PATH' вашей системы, система будет использовать версию php для пивоварения. Если вы удалите php brew php, ваша система вернется к использованию двоичного файла php в '/ usr/bin'. – Asaph

4

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

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

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

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

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

1

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

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

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

Если удалить эту опцию, локон будет решать, какую версию использовать по умолчанию. Проверьте документацию curl_setopt.

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