osx 10.10 CURL POST到HTTPS url给出SSLRead()错误


72

我最近才升级到OSX 10.10 Yosemite,并且由于升级,我无法再将Curl POST转换为SSL url。

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

错误号:56

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

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

谁能帮我吗?


5
为什么拒绝投票???这是我遇到的一个实际问题,在Google中找不到任何好的解决方案
Mattijs 2014年

1
您可能不满意,因为尽管这是一个完全合理的问题,但对于SO而言这不是主题-它实际上应该在Serverfault上。
同步2015年

12
在Mattijs的辩护中,他wp_remote_request()使用PHP编写了一个调用,该调用依赖于下面的cURL。我认为他提出SO的要求是正确的,因为他的近端问题始于编码。只有在知道答案后,他才能知道ServerFault上的问题可能会更好
Kirby

1
谢谢哥们。这正是我的意图。
Mattijs,2015年

1
@Mattijs我在2017 MBP上也遇到了这些错误。同样的解决方案也对我有用。
mishka

Answers:


142

我已经看到当使用在优胜美地下使用Apple的Secure Transport的cURL版本编译php且URL请求的目标不支持SSLv3(由于POODLE漏洞而被禁用)时,会发生此错误。该命令的输出是什么?

$ php -i | grep "SSL Version"

我怀疑您会看到以下内容:

SSL Version => SecureTransport

您可以通过安装使用版本cURL的php版本来解决此问题,该版本的cURL使用OpenSSL而不是SecureTransport。使用自制程序最容易做到这一点。因此,如果尚未安装,请先安装。如果已安装自制软件,但brew update自升级到优胜美地以来您还没有运行过,请首先执行此操作。还要确保您已安装XCode> = 6.1和最新的XCode命令行工具。brew doctor会告诉您您是否做对了。

在下面添加您需要的Homebrew水龙头,以安装冲泡的php。如果这些存储库已被窃听,请跳过此步骤。如果不确定这些存储库是否已被窃听,请运行以下命令。最坏的情况下,您将无害Warning: Already tapped!

$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/php

然后使用openssl安装curl:

$ brew install --with-openssl curl

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

$ 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消失。


2
嗨,Asaph,是的,我有SSL版本=> SecureTransport。我有Brew,只是想知道用Brew安装是否会覆盖当前的php,还是会在其旁边添加另一个PHP版本,以便我必须禁用库存版本?也感谢您的详尽回答。我不会发现自己,要具体解决一个问题
Mattijs 2014年

这是我得到的openssl信息:New, TLSv1/SSLv3, Cipher is RC4-MD5 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1 Cipher : RC4-MD5 Session-ID: 0B220000E93AF2E279F784D25D6FC08675E63F983424A4296BEBE59AF89F3E7C Session-ID-ctx: Master-Key: 4B0BFE2ECC5624D0E3A2AD44FF6DC30F25E0C4889C6CA5EF0D0E90C1469D70C9D6B5321A4B2C1A084355A79A013C4420 Key-Arg : None Start Time: 1414123290 Timeout : 300 (sec) Verify return code: 0 (ok)
Mattijs 2014年

1
嗨,Asaph,我安装了BREW PHP版本,在按照brew医生的建议后一切正常。SSL调用现在可以使用PHP(wordpress wp_remote_request)进行。然而,当我在终端相同enpoint卷曲,我再次看到那些-9806: * SSLRead() return error -9806 * Closing connection 0 curl: (56) SSLRead() return error -9806。当我执行php -i时,我看到Brew版本正在运行,因为构建日期是昨天。命令行Curl可能是我昨天酿造的旧版本而不是新版本吗?
Mattijs 2014年

1
在可以运行之前,我必须按照在Mac OS X上(重新)安装PHP上brew tap说明进行操作,但除此之外,这个答案很可靠。brew install php55

1
@Tony您可以重新编译Apple的PHP版本,但这似乎更具侵入性。关于homebrew的好处是,它会将所有内容安装到/usr/localOSX不会触及的所有文件中,并在其中“覆盖”二进制文件/usr。因此,如果有一天您决定要返回使用Apple版本的PHP,则只需删除由homebrew安装的版本,然后系统就会恢复到以前的状态。
Asaph 2015年

5

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

SSL手册(SSL_get_error)没有对此进行详细说明,但是此错误消息来自libcurlSecureTransport / Darwinssl TLS后端使用的内置消息(您可以在SecureTransport.h头文件中找到其OSStatus ):

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

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

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


1

我也有类似的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出现的许多情况之一的解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.