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

Mat*_*ijs 72 php apache macos curl osx-yosemite

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

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

错误号码:56

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

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

谁能帮我吗?

Asa*_*aph 142

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

$ php -i | grep "SSL Version"
Run Code Online (Sandbox Code Playgroud)

我怀疑你会看到这个:

SSL Version => SecureTransport
Run Code Online (Sandbox Code Playgroud)

你可以通过安装一个使用OpenSSL而不是SecureTransport的cURL版本的php来解决这个问题.使用自制软件最容易做到这一点.如果您还没有安装,请先安装它.如果安装了自制程序,但brew update自从升级到Yosemite后仍未运行,请先执行此操作.还要确保已安装XCode> = 6.1和最新的XCode命令行工具.brew doctor会告诉你你是否已经做好了.

添加下面的Homebrew点击,以便安装brewed php.如果已经点击了这些回购,请跳过此步骤.如果您不确定是否已经点击了这些回购,请运行以下命令.最糟糕的情况是,你会变得无害Warning: Already tapped!

$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/php
Run Code Online (Sandbox Code Playgroud)

然后用openssl安装curl:

$ brew install --with-openssl curl
Run Code Online (Sandbox Code Playgroud)

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

$ brew install --with-homebrew-curl --with-httpd24 php55
Run Code Online (Sandbox Code Playgroud)
  • 如果使用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
    
    Run Code Online (Sandbox Code Playgroud)

安装你需要的任何php扩展,例如.mcrypt.

$ brew install php55-mcrypt
Run Code Online (Sandbox Code Playgroud)

完成后,再次运行:

$ php -i | grep "SSL Version"
Run Code Online (Sandbox Code Playgroud)

你应该看到:

SSL Version => OpenSSL/1.0.2h
Run Code Online (Sandbox Code Playgroud)

现在,重新测试你的应用程序,它SSLRead() return error -9806应该消失.

  • 嗨,Asaph,是的,我有SSL版本=> SecureTransport.我有Brew,只是想知道用Brew安装是否会覆盖我当前的php,还是会添加另一个PHP版本以便我必须禁用库存版本?还要感谢您的全面解答.我不会发现自己,特定的问题 (2认同)

ken*_*orb 5

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

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

errSSLClosedAbort           = -9806,    /* connection closed via error */
Run Code Online (Sandbox Code Playgroud)

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

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