Curl POST to HTTPS url gives SSLRead() error:curl: (56) SSLRead() return error -9806

當系統升級到OSX 10.10.3的時候,用brew更新軟件安裝包,出現了curl拋出的錯誤。

==> Upgrading boost
==> Downloading https://homebrew.bintray.com/bottles/boost-1.58.0.yosemite.bottle.tar.gz
                                                                           0.7%
curl: (56) SSLRead() return error -9806
Error: Failed to download resource "boost"

起初,以爲是寬帶的問題,據說某寬帶在使用過程中老是插入廣告,竟連curl抓取數據包都難免植入廣告。


如果是寬帶的問題,應該說curl獲取一切信息都會出錯,經嘗試,對於http協議的請求都是fine的,那麼嘗試https協議,發現github也是好的,可以收到數據。但是,一旦請求的https的具體的某一個包的時候,出現curl(56)錯誤:

error:curl: (56) SSLRead() return error -9806

查詢得知:curl(56)錯誤是----CURL_RECV_ERROR:Failure with receiving network data.

意思很明確了:curl接收網絡數據失敗。


最後的最後,只能從網上獲取答案:很幸運,有人比我早遇到此類問題:

在stackoverflow上有篇名爲《osx 10.10 Curl POST to HTTPS url gives SSLRead() error


I just recently upgraded to OSX 10.10 Yosemite and I since the upgrade I can't do Curl POST to a SSL url anymore.

I first used wordpress' wp_remote_request call and also tried to use curl in php.Both (as expected) give the same error message:

Error Number:56Error String:SSLRead() return error -9806

Note: when I curl POST to HTTP it works fine.I reckon it is a setting in PHP.ini or in my apache (I lost my original HTTPD.conf file after upgrade...).

Can anyone help me out?


這是被採取的答案:

I've seen this error happen when php is compiled with a version of cURL that usesApple's Secure Transport under Yosemite and the target of the URL request doesn't support SSLv3 (which was probably disabled due to thePOODLE vulnerability). What is the output of this command?

$ php -i | grep "SSL Version"

I suspect you'll see this:

SSL Version => SecureTransport

You can overcome this by installing a version of php which uses a version of cURL which uses OpenSSL instead of SecureTransport. This is most easily done withhomebrew. So install that first if you don't already have it. If homebrew is installed but you haven't runbrew update since upgrading to Yosemite, do that first. Also make sure you've installed XCode >= 6.1 and the latest XCode command line tools.brew doctor will tell you if you've done it all right.

Add the Homebrew taps below that you will need in order to get brewed php installed. Skip this step if these repos are already tapped. If you're unsure if these repos are already tapped, just run the commands below. Worst case scenario, you'll get a harmlessWarning: Already tapped!

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

Then install curl with openssl:

$ brew install --with-openssl curl

Then install php using the curl you just installed and brewed openssl:

$ brew install \
    --with-apache \
    --with-homebrew-curl \
    --with-homebrew-openssl \
    --without-snmp php55
  • if you're running nginx change --with-apache to --with-fpm.
  • the --without-snmp is necessary because of issue #1311.
  • if using apache, make sure to add LoadModule php5_module /usr/local/opt/php55/libexec/apache2/libphp5.so to your/etc/apache2/httpd.conf and restart apache.

Install any php extensions you're going to need eg. mcrypt.

$ brew install php55-mcrypt

After you're done, run this again:

$ php -i | grep "SSL Version"

And you should see:

SSL Version => OpenSSL/1.0.1j

And now, re-test your application and the SSLRead() return error -9806 should go away.


大概意思:

先使用命令

php -i |grep "SSL Version"

看看SSL Version的信息,猜想你看到是:

SSL Version => SecureTransport

那麼,就可以按照下面的命令去做:

$ brew tap homebrew/dupes

$ brew tap homebrew/versions

$ brew tap homebrew/php

有可能會出現不傷大雅的警告信息:Already tapped!

重點來了:

然後使用openssl安裝curl,這就是要替換掉原來的curl,命令如下:

$ brew install --with-openssl curl

然後使用剛纔安裝的curl和openssl安裝php:

$ brew install \
    --with-apache \
    --with-homebrew-curl \
    --with-homebrew-openssl \
    --without-snmp php55
  • 如果你想運行nginx,將 --with-apache 改爲--with-fpm.
  • 因爲 issue #1311的緣故,--without-snmp是必須.
  • 如果使用apache,確保添加 LoadModule php5_module /usr/local/opt/php55/libexec/apache2/libphp5.so到/etc/apache2/httpd.conf並重啓apache.

安裝你需要的php的其他擴展,例如 : mcrypt.

$ brew install php55-mcrypt

完成後,再次運行下面的命令:

$ php -i | grep "SSL Version"

你會看到:

SSL Version => OpenSSL/1.0.1j


好吧,這個問題就這樣解決了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章