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

问题描述 投票:72回答:3

我刚刚升级到OSX 10.10 Yosemite和我升级后我不能再将Curl POST发送到SSL网址了。

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

错误号码:56

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

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

谁能帮我吗?

php macos apache curl osx-yosemite
3个回答
142
投票

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

$ php -i | grep "SSL Version"

我怀疑你会看到这个:

SSL Version => SecureTransport

你可以通过安装一个使用OpenSSL而不是SecureTransport的cURL版本的php来解决这个问题。使用homebrew最容易做到这一点。如果您还没有安装,请先安装它。如果安装了自制软件,但自从升级到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: qazxsw poi

安装你需要的任何php扩展,例如。 mkdir -p ~/Library/LaunchAgents cp /usr/local/opt/php55/homebrew.mxcl.php55.plist ~/Library/LaunchAgents/ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php55.plist

mcrypt

完成后,再次运行:

$ brew install php55-mcrypt

你应该看到:

$ php -i | grep "SSL Version"

现在,重新测试你的应用程序,SSL Version => OpenSSL/1.0.2h 应该消失。


5
投票

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

SSL手册(SSLRead() return error -9806)没有详细记录这一点,但是这个错误消息来自于构建的SSL_get_error,它由SecureTransport / Darwinssl TLS后端使用(您可以在libcurl头文件中找到它的OSStatus):

SecureTransport.h

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

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


1
投票

我有errSSLClosedAbort = -9806, /* connection closed via error */ 错误的类似问题,我也有SSLRead() return error -9806

但在我的情况下,问题是我设置curl SSL Version => SecureTransport选项:

CURLOPT_HTTP_VERSION

如果删除该选项,cURL将决定默认使用哪个版本。查看$curl = curl_init(); curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); 文档了解更多信息。

这对我有用,我不需要用cURL和PHP来改变任何东西。但这是curl_setopt出现的许多案例之一的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.