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

Php osx 10.10 Curl POST to HTTPS url给出SSLRead()错误,php,macos,apache,curl,osx-yosemite,Php,Macos,Apache,Curl,Osx Yosemite,我最近刚升级到OSX 10.10 Yosemite,升级后我再也不能向SSL url发布Curl了 我首先使用wordpress的wp\u remote\u request调用,还尝试在php中使用curl。 两者(如预期)都给出相同的错误消息: 错误号码:56 错误字符串:SSLRead()返回错误-9806 注意:当我将POST卷曲到HTTP时,它可以正常工作。 我认为这是PHP.ini或apache中的一个设置(升级后我丢失了原来的HTTPD.conf文件…) 有人能帮我吗?当php使用Y

我最近刚升级到OSX 10.10 Yosemite,升级后我再也不能向SSL url发布Curl了

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

错误号码:56

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

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


有人能帮我吗?

当php使用Yosemite下使用的cURL版本编译时,我看到了这个错误,并且URL请求的目标不支持SSLv3(可能是由于错误而被禁用)。这个命令的输出是什么

$ php -i | grep "SSL Version"
我想你会看到:

SSL Version => SecureTransport
您可以通过安装一个php版本来克服这个问题,该版本使用一个使用OpenSSL而不是SecureTransport的cURL版本。这是最容易做到的。因此,如果您还没有安装,请先安装它。如果安装了homebrew,但升级到Yosemite后您还没有运行
brew update
,请先执行此操作。还要确保您已经安装了XCode>=6.1和最新的XCode命令行工具
brew doctor
会告诉您是否做得很好

在下面添加您需要的自制龙头,以便安装brewed php。如果已点击这些回购,则跳过此步骤。如果您不确定这些回购是否已被点击,只需运行下面的命令。最坏情况下,您将得到无害的
警告:已点击

$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/php
然后使用openssl安装curl:

$ brew install --with-openssl curl
然后使用刚刚安装并制作的openssl安装php:

$ brew install --with-homebrew-curl --with-httpd24 php55
  • 如果使用apache,请确保将
    加载模块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
现在,重新测试您的应用程序,返回错误-9806应该消失。

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

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

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


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

我在
SSLRead()返回错误-9806
错误中遇到类似问题,我还有
SSL版本=>SecureTransport

但在我的例子中,问题是我设置了curl
CURLOPT\u HTTP\u VERSION
选项:

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


这对我很有效,我不需要用cURL或PHP更改任何内容。但这是出现
错误-9806
的许多情况中的一种解决方案。

为什么要投反对票???这是我正在经历的一个真实的问题,在Google中找不到任何好的解决方案。你可能得到了否决票,因为虽然这是一个完全合理的问题,但这是一个离题的问题——它应该是服务器故障。为Mattijs辩护,他在PHP中编写了一个调用
wp\u remote\u request()
,它依赖于下面的cURL。我认为他这样问是有道理的,因为他最近的问题是从编码开始的。只有在知道了答案之后,他才能知道这个问题可能会更好。这正是我的本意。@Mattijs我在2017年的MBP中也遇到了这些错误。同样的解决方案也适用于我。Hi Asah,是的,我有SSL版本=>SecureTransport。我有Brew,只是想知道使用Brew安装是否会覆盖我当前的php,或者它是否会同时添加另一个php版本,以便我必须禁用该版本?也谢谢你的详尽回答。我自己也不会发现,具体到一个问题,这是我得到的openssl信息:
New,TLSv1/SSLv3,密码为RC4-MD5服务器公钥为2048位安全重新协商支持压缩:无扩展:无SSL会话:协议:TLSv1密码:RC4-MD5会话ID:0B220000E93AF2E279F784D25D6FC08675E63F983424A4296BE59AF89F3E7C会话ID:ctx:主密钥:4B0BFE2ECC5624D0E3A2AD44FF6DC30F25E0C4889C6CA5EF0D0E90C1469D70C9D6B5321A4B2C1A084355A79A013C4420关键参数:无开始时间:1414123290超时:300(秒)验证返回代码:0(确定)
嗨,我安装了BREW PHP版本,在遵循BREW医生的建议后一切正常。SSL调用现在正在使用PHP(wordpress wp_remote_request)工作。但是,当我将终端卷曲到同一个enpoint时,我再次看到-9806:
*SSLRead()返回错误-9806*关闭连接0卷曲:(56)SSLRead()返回错误-9806
。当我使用php时,我看到Brew
$curl = curl_init();    
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);