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

2022-08-30 08:45:20

我最近刚刚升级到OSX 10.10 Yosemite,自从升级以来,我无法再将Curl POST设置为SSL网址。

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

错误编号:56

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

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

任何人都可以帮我吗?


答案 1

我已经看到这个错误发生在php编译时使用苹果在Yosemite下的安全传输的cURL版本,并且URL请求的目标不支持SSLv3(可能是由于POODLE漏洞而被禁用的)。此命令的输出是什么?

$ php -i | grep "SSL Version"

我怀疑你会看到这个:

SSL Version => SecureTransport

您可以通过安装一个版本的php来克服这个问题,该版本使用使用OpenSSL而不是SecureTransport的cURL版本。这最容易用自制啤酒完成。因此,如果您还没有它,请先安装它。如果安装了自制软件,但自升级到优胜美地以来您尚未运行,请先执行此操作。还要确保您已安装 XCode >= 6.1 和最新的 XCode 命令行工具。 会告诉你,如果你做得好。brew updatebrew doctor

在下面添加自制水龙头,您需要这些水龙头才能安装酿造的php。如果已点击这些存储库,请跳过此步骤。如果您不确定是否已点击这些存储库,只需运行以下命令即可。最坏的情况,你会得到一个无害的Warning: Already tapped!

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

然后使用opensl安装curl:

$ brew install --with-openssl curl

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

$ brew install --with-homebrew-curl --with-httpd24 php55
  • 如果使用apache,请确保添加到您的并重新启动apache。LoadModule php5_module /usr/local/opt/php55/libexec/apache2/libphp5.so/etc/apache2/httpd.conf

  • 如果不使用 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

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

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

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

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

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


推荐