osx 10.10 Curl POST到HTTPS url会出现SSLRead()错误

时间:2014-10-20 09:05:06

标签: php macos apache curl osx-yosemite

我刚刚升级到OSX 10.10 Yosemite,我从升级开始就不再使用Curl POST到SSL网址了。

我首先使用了wordpress' wp_remote_request调用,并尝试在php中使用curl。 两者(如预期的那样)给出相同的错误消息:

  

错误号码:56

     

错误字符串:SSLRead()返回错误-9806

注意:当我将POST卷曲到HTTP时,它可以正常工作。 我认为这是PHP.ini或我的apache中的设置(升级后我丢失了原来的HTTPD.conf文件...)。

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:142)

我看到当使用在Yosemite下使用Apple's Secure Transport的cURL版本编译php时,会发生此错误,并且URL请求的目标不支持SSLv3(由于{{ 3}})。这个命令的输出是什么?

$ php -i | grep "SSL Version"

我怀疑你会看到这个:

SSL Version => SecureTransport

你可以通过安装一个使用OpenSSL而不是SecureTransport的cURL版本的php来解决这个问题。使用POODLE vulnerability可以轻松完成此操作。如果您还没有安装,请先安装它。如果安装了自制程序,但由于升级到Yosemite后尚未运行brew update,请先执行此操作。还要确保已安装XCode> = 6.1和最新的XCode命令行工具。 brew doctor会告诉你你是否已经做好了。

添加下面的Homebrew点击,以便安装brewed php。如果已经点击了这些回购,请跳过此步骤。如果您不确定是否已经点击了这些回购,请运行以下命令。最糟糕的情况是,你会得到一个无害的Warning: Already tapped!

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

然后使用openssl:

安装curl
$ brew install --with-openssl curl

然后使用你刚刚安装的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应该消失。

答案 1 :(得分:5)

此SSL错误(OSStatus代码:9806)表示由于建立连接时出错(例如,在某些无效命令上),服务器终止了您的连接。这似乎仅在与远程主机的SSL连接之间出现时才发生。

SSL手册(MFi Program)没有详细记录,但是此错误消息来自libcurl构建,由SecureTransport / Darwinssl TLS后端使用(您可以在{{找到它的OSStatus) 1}}头文件):

SecureTransport.h

根据我的经验,这通常发生在您使用代理或连接到使用身份验证机制的有限网络时。

因此,请确认您已连接到正确的网络(通过WiFi)并且您的其他HTTPS正常工作。如果没有,请检查您是否需要指定代理凭据,或者您的ISP是否覆盖了证书链,并且需要某种身份验证,或者它基本上阻止了对其防火墙中某些站点的访问。

答案 2 :(得分:1)

我遇到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出现的许多情况之一的解决方案。