我最近刚升级到OSX 10.10 Yosemite,自从升级后,我再也不能对SSL url执行Curl POST了。
我首先使用wordpress的wp_remote_request
调用,也尝试在php中使用curl。两者(不出所料)都给出了相同的错误消息:
错误号:56
错误字符串:SSLRead()返回错误-9806
注意:当我将curl POST转到HTTP时,它工作得很好。我认为这是PHP.ini或我的apache中的一个设置(我在升级后丢失了原始的HTTPD.conf文件...)。
有人能帮我吗?
发布于 2014-10-24 05:54:32
我见过当php是用Yosemite下使用Apple's Secure Transport的cURL版本编译的,而URL请求的目标不支持SSLv3 (可能是因为POODLE vulnerability而被禁用)时,就会出现这个错误。此命令的输出是什么?
$ php -i | grep "SSL Version"
我猜你会看到这个:
SSL Version => SecureTransport
你可以通过安装一个使用cURL的php版本来克服这个问题,这个版本使用的是OpenSSL而不是SecureTransport。使用homebrew最容易做到这一点。因此,如果您还没有安装,请先安装它。如果安装了自制软件,但在升级到优胜美地后还没有运行过brew update
,请先运行它。另外,请确保您已经安装了XCode >= 6.1和最新的XCode命令行工具。如果你做得对,brew doctor
会告诉你。
在下面添加您需要的Homebrew水龙头,以便安装brewed php。如果这些回购已被点击,请跳过此步骤。如果您不确定这些repos是否已经被点击,只需运行下面的命令。最坏的情况是,你会得到一个无害的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
LoadModule php5_module /usr/local/opt/php55/libexec/apache2/libphp5.so
添加到您的/etc/apache2/httpd.conf
中并重新启动apache。--with-httpd24
。要在启动时启动php-fpm:
mkdir代理~/库/启动代理cp /usr/local/opt/php55/homebrew.mxcl.php55.plist ~/库/启动代理/启动cp -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
应该会消失。
发布于 2016-03-16 01:49:49
此SSL错误(OSStatus代码: 9806)意味着您的连接已被服务器终止,原因是建立连接时出错(例如,在某些无效命令上)。这似乎只有在到远程主机的SSL连接中断的情况下才会发生。
SSL手册(SSL_get_error
)没有很好地记录这一点,但是这个错误消息来自SecureTransport/Darwinssl TLS后端使用的libcurl
built (你可以在SecureTransport.h
头文件中找到它的OSStatus ):
errSSLClosedAbort = -9806, /* connection closed via error */
根据我的经验,这通常发生在您处于代理之后或连接到使用身份验证机制的有限网络时。
因此,请验证您是否已连接到正确的网络(通过WiFi)以及您的其他HTTPS是否正常工作。如果没有,请检查您是否需要指定代理凭据,或者您的ISP正在覆盖证书链并要求某种身份验证,或者它基本上是在防火墙中阻止对某些站点的访问。
发布于 2017-02-17 00:02:24
我的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
出现的众多情况中的一种解决方案。
https://stackoverflow.com/questions/26461966
复制相似问题