MAMP SSL error: "error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure"

MAMP SSL error: "error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure"

我在 OS X Yosemite 上使用 MAMP 在本地计算机上开发网站。该网站是在 HTTPS 上运行的 API 的客户端应用程序。当我尝试从 PHP:

调用 API 时,我不断收到此错误
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

相同的代码可在服务器上运行,但该站点已投入生产,因此我需要能够创建一个单独的开发环境。无论我用 cURL 还是 file_get_contents 调用 API,我都会得到完全相同的错误。我可以在命令行上使用 cURL 或在我的浏览器中加载 URL,它工作正常。我花了几个小时通读并尝试了我可以在本网站和其他地方找到的所有其他解决方案,其中 none 有效。有没有其他人看到这个问题?

更新: 在发布这个问题之前,我终于在最后的努力中找到了解决方案,但这是一个如此痛苦的过程,所以我还是发布了它,希望它能解决可以帮助其他人避免这场令人毛骨悚然的灾难。我的解决方案如下。

解决方法:

  1. brew install openssl
  2. 下载并解压最新的 cURL
  3. 在cURL源目录中:

    LDFLAGS="-L/usr/local/opt/openssl/lib" CPPFLAGS="-I/usr/local/opt/openssl/include" ./configure --prefix=/Applications/MAMP/Library/
    
  4. make
  5. make install
  6. 重新启动 MAMP
  7. 在PHP,在curl_initcurl_exec之间:

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    

解释:

找到解决方案的路径以 this site 开头,它描述了 MAMP 上的一个不同的 SSL 错误,并建议使用
重新编译新版本的 cURL --prefix=/Applications/MAMP/Library/ 覆盖 MAMP 使用的那个。我试过了,但没用。后来,有什么事让我研究了 cURL 编译选项,我注意到在编译时指定不同版本的 OpenSSL 的说明。我决定试一试(向自己保证这是最后一次尝试然后我会放弃)。我用 Homebrew 安装了一个最新的 OpenSSL 包,它的有用 post-install 信息说:

If you build your own software and it requires this formula, you'll need to add to your 
build variables:

LDFLAGS:  -L/usr/local/opt/openssl/lib
CPPFLAGS: -I/usr/local/opt/openssl/include

这看起来与我在 cURL 编译选项中看到的内容相似,它为上述内容指定了正确的语法:

LDFLAGS="-L/usr/local/opt/openssl/lib" CPPFLAGS="-I/usr/local/opt/openssl/include" ./configure

我在--prefix=/Applications/MAMP/Library/里加回来了,接着是平时的makemake install,重启MAMP,松了一口气。

我后来发现我从另一个网站输入的 cURL 选项之一对于避免不同的 SSL 错误也是必要的 ("SSL certificate problem: unable to get local issuer certificate")。将 CURLOPT_SSL_VERIFYPEER 设置为 false 为我解决了这个问题。

这是一个适用于 OSX 10.11.1

上的 MAMP Pro 3.5 运行 的解决方案

在您的 PHP 中,您可能需要为 curl_init() 设置 SSL 版本和匹配的密码:

curl_setopt($ch, CURLOPT_SSLVERSION, 1);
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');

有关您可以传递给 CURLOPT_SSLVERSION 的确切参数,请参阅:http://php.net/manual/en/function.curl-setopt.php

此外,以下内容还可以显示与 SSL 版本相关的错误,用于帮助您找到确切的版本冲突:

$error = curl_error($ch);
echo $error;

有关此命令的更多信息:http://php.net/manual/en/ref.curl.php

我遇到过同样的问题。我通过使用 Apple 首选的 SecureTransport SSL 程序解决了这个问题。以下对我有用:

  1. here
  2. 下载最新的 curl (zip) 版本
  3. 转到您的下载文件夹并双击解压缩 zip 文件。现在您的下载文件夹中将有一个包含提取文件的文件夹。
  4. 打开终端并导航到文件夹 `cd ~/Downloads/curl-folder-name'
  5. 然后在终端输入./configure --prefix=/Applications/MAMP/Library/ --with-darwinssl
  6. make && make install

重新启动 MAMP 并查看更改是否有效。一种检查方法是在终端的 MAMP php 程序中调用以下命令:

/Applications/MAMP/bin/php/php5.5.14/bin/php -r 'echo json_encode(curl_version(), JSON_PRETTY_PRINT);'

你应该看到 "ssl_version": "SecureTransport"

我通过更新 curl 解决了这个问题。 (检查curl版本和openssl版本,它们可能不匹配)

curl 7.12.1 需要 OpenSSL/0.9.7a 但我的 OpenSSL 是 1.0.2m.

详情: ~ $ curl -V curl 7.12.1 (x86_64-redhat-linux-gnu) libcurl/7.12.1 OpenSSL/0.9.7a zlib/1.2.1.2 libidn/0.5.6 协议:ftp gopher telnet dict ldap http 文件 https ftps 特性:GSS-协商 IDN IPv6 大文件 NTLM SSL libz ~ $ openssl 版本 OpenSSL 1.0.2m 2017 年 11 月 2 日