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

Posted

技术标签:

【中文标题】osx 10.10 Curl POST 到 HTTPS url 给出 SSLRead() 错误【英文标题】:osx 10.10 Curl POST to HTTPS url gives SSLRead() error 【发布时间】:2014-12-15 05:13:54 【问题描述】:

我最近刚刚升级到 OSX 10.10 Yosemite,自从升级后我不能再对 SSL url 进行 Curl POST。

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

错误号:56

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

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

谁能帮帮我?

【问题讨论】:

为什么要投反对票???这是我遇到的真实问题,在 Google 中找不到任何好的解决方案 您可能投了反对票,因为尽管这是一个完全合理的问题,但它与 SO 无关——它确实应该在 Serverfault 上。 在 Mattijs 的辩护中,他在 PHP 中编写了对 wp_remote_request() 的调用,该调用依赖于底层的 cURL。我认为他在 SO 上提出的问题是有效的,因为他最近的问题是从编码开始的。只有在知道答案之后,他才能知道这个问题在ServerFault上可能会更好 谢谢哥们。这正是我的本意。 @Mattijs 我在 2017 MBP 上也遇到了这些错误。同样的解决方案也适用于我。 【参考方案1】:

当使用 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:

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 应该会消失。

【讨论】:

嗨 Asaph,是的,我有 SSL 版本 => SecureTransport。我有 Brew,只是想知道使用 Brew 安装是否会覆盖我当前的 php,还是会在旁边添加另一个 PHP 版本,以便我必须禁用库存版本?也感谢您的彻底回答。我不会自己发现具体问题 这是我得到的 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) 嗨 Asaph,我安装了 BREW PHP 版本,按照 brew Doctor 的建议一切正常。 SSL 调用现在正在使用 PHP (wordpress wp_remote_request)。但是,当我在终端中卷曲到同一个端点时,我再次看到 -9806:* SSLRead() return error -9806 * Closing connection 0 curl: (56) SSLRead() return error -9806。当我执行 php -i 时,我看到 Brew 版本正在运行,因为构建日期是昨天。难道命令行Curl是旧的而不是我昨天酿的新的? 我必须按照(Re)installing PHP on Mac OS X 的brew tap 说明才能运行brew install php55,但除此之外,这个答案很可靠。 @Tony 您可以重新编译 Apple 的 PHP 版本,但这似乎更具侵入性。 homebrew 的好处在于它将所有内容安装到/usr/local(OSX 没有触及)并在/usr 中“覆盖”二进制文件。因此,如果有一天您决定重新使用 Apple 版本的 PHP,您只需删除由 homebrew 安装的那个,您的系统就会恢复到以前的状态。【参考方案2】:

此 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 是否覆盖了证书链并需要某种身份验证,或者它基本上阻止了对其防火墙中某些站点的访问。

【讨论】:

【参考方案3】:

我遇到了与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 出现的许多情况之一的解决方案。

【讨论】:

以上是关于osx 10.10 Curl POST 到 HTTPS url 给出 SSLRead() 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 OSX 10.10 Yosemite 上安装 Nokogiri

osx升级到10.10后,用pod install报错终于解决的方法

VM安装OSX进度条一半时卡住不动,附OSX10.10 ISO镜像文件

git pull 上的 OSX 10.10 yosemite beta:git-sh-setup:没有这样的文件或目录

OSX 10.10 PHP Composer 找不到所需的扩展 intl 和 mcrypt

如何在 OSX 10.10 Yosemite 上安装 xcode 5