我刚刚升级到OSX 10.10 Yosemite,我从升级开始就不再使用Curl POST到SSL网址了。
我首先使用了wordpress' wp_remote_request
调用,并尝试在php中使用curl。
两者(如预期的那样)给出相同的错误消息:
错误号码:56
错误字符串:SSLRead()返回错误-9806
注意:当我将POST卷曲到HTTP时,它可以正常工作。 我认为这是PHP.ini或我的apache中的设置(升级后我丢失了原来的HTTPD.conf文件...)。
任何人都可以帮助我吗?
答案 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
出现的许多情况之一的解决方案。