首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >OSX10.10到HTTPS url的卷曲POST出现SSLRead()错误

OSX10.10到HTTPS url的卷曲POST出现SSLRead()错误
EN

Stack Overflow用户
提问于 2014-10-20 17:05:06
回答 3查看 37.2K关注 0票数 72

我最近刚升级到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文件...)。

有人能帮我吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-24 05:54:32

我见过当php是用Yosemite下使用Apple's Secure Transport的cURL版本编译的,而URL请求的目标不支持SSLv3 (可能是因为POODLE vulnerability而被禁用)时,就会出现这个错误。此命令的输出是什么?

代码语言:javascript
复制
$ php -i | grep "SSL Version"

我猜你会看到这个:

代码语言:javascript
复制
SSL Version => SecureTransport

你可以通过安装一个使用cURL的php版本来克服这个问题,这个版本使用的是OpenSSL而不是SecureTransport。使用homebrew最容易做到这一点。因此,如果您还没有安装,请先安装它。如果安装了自制软件,但在升级到优胜美地后还没有运行过brew update,请先运行它。另外,请确保您已经安装了XCode >= 6.1和最新的XCode命令行工具。如果你做得对,brew doctor会告诉你。

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

代码语言:javascript
复制
$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/php

然后使用openssl安装curl:

代码语言:javascript
复制
$ brew install --with-openssl curl

然后使用您刚刚安装的curl安装php,并酿造openssl:

代码语言:javascript
复制
$ 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代理~/库/启动代理cp /usr/local/opt/php55/homebrew.mxcl.php55.plist ~/库/启动代理/启动cp -w ~/Library/LaunchAgents/homebrew.mxcl.php55.plist

安装任何你需要的php扩展,例如。mcrypt

代码语言:javascript
复制
$ brew install php55-mcrypt

完成后,再次运行此命令:

代码语言:javascript
复制
$ php -i | grep "SSL Version"

你应该看到:

代码语言:javascript
复制
SSL Version => OpenSSL/1.0.2h

现在,重新测试您的应用程序,SSLRead() return error -9806应该会消失。

票数 142
EN

Stack Overflow用户

发布于 2016-03-16 01:49:49

此SSL错误(OSStatus代码: 9806)意味着您的连接已被服务器终止,原因是建立连接时出错(例如,在某些无效命令上)。这似乎只有在到远程主机的SSL连接中断的情况下才会发生。

SSL手册(SSL_get_error)没有很好地记录这一点,但是这个错误消息来自SecureTransport/Darwinssl TLS后端使用的libcurl built (你可以在SecureTransport.h头文件中找到它的OSStatus ):

代码语言:javascript
复制
errSSLClosedAbort           = -9806,    /* connection closed via error */

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

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

票数 5
EN

Stack Overflow用户

发布于 2017-02-17 00:02:24

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

但在我的例子中,问题是我设置了curl CURLOPT_HTTP_VERSION选项:

代码语言:javascript
复制
$curl = curl_init();    
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);

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

这对我来说很有效,而且我不需要用cURL或PHP来改变任何东西。但这是error -9806出现的众多情况中的一种解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26461966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档