OSX 10.10curlPOST HTTPS URL给SSLRead()错误

我只是最近升级到OSX 10.10优胜美地和我自升级以来,我不能做curlPOST到一个SSLurl了。

我第一次使用WordPress的wp_remote_request调用,也试图在PHP中使用curl。 两者(如预期的)给出相同的错误信息:

错误号码:56

错误string:SSLRead()返回错误-9806

注意:当我curlPOST到HTTP它工作正常。 我认为这是在PHP.ini或我的apache(我升级后失去了我原来的HTTPD.conf文件…)的设置。

谁能帮我吗?

我已经看到这个错误发生时,PHP编译与使用优胜美地下的苹果的安全传输 cURL的版本和URL请求的目标不支持SSLv3(可能由于POODLE漏洞 ,可能被禁用)。 这个命令的输出是什么?

 $ php -i | grep "SSL Version" 

我怀疑你会看到这个:

 SSL Version => SecureTransport 

你可以通过安装一个使用OpenSSL而不是SecureTransport的cURL版本的php来克服这个问题。 这是用自制软件最容易做到的。 所以先安装,如果你还没有。 如果安装了自制软件,但是升级到Yosemite后还没有运行brew update ,请先执行此操作。 还要确保你已经安装了XCode> 6.1和最新的XCode命令行工具。 brew doctor会告诉你,如果你做得很好。

添加自制水龙头下,你将需要为了得到酿造的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 

而现在,重新testing你的应用程序和SSLRead() return error -9806应该消失。

此SSL错误(OSStatus代码:9806)意味着您的连接由于build立连接时发生错误(例如某些无效的命令)而被服务器终止。 这似乎只发生在与远程主机的SSL连接中断的情况下。

SSL手册( SSL_get_error )没有很好的logging,但是这个错误信息来自于SecureTransport / Darwinssl TLS后端使用的libcurl (可以在SecureTransport.h头文件中find它的OSStatus):

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

从我的经验来看,这通常发生在代理的后面,或者连接到使用authentication机制的有限networking上。 。

所以请确认您已连接到正确的networking(通过WiFi),而其他HTTPS正常工作。 如果不是,请检查您是否需要指定代理凭证,或者您的ISP正在重写证书链,并且需要某种身份validation,或者基本上阻止访问防火墙中的某些站点。

我有一个与SSLRead() return error -9806错误类似的问题,我也有SSL Version => SecureTransport

但在我的情况下,问题是我设置curlCURLOPT_HTTP_VERSION选项:

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

如果删除该选项,cURL将默认决定使用哪个版本。 查看更多的curl_setopt文档。

这对我很有用,我不需要用cURL和PHP来改变任何东西。 但是,这是出现error -9806的许多情况之一的解决scheme。