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

4

我正在使用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,这样就可以正常工作了。我花了数小时阅读和尝试在本网站和其他地方找到的所有其他解决方案,但没有一个有效。是否有其他人遇到过这个问题?
更新:在发布这个问题之前,我终于在最后一搏中找到了一个解决方案,但这是如此痛苦的过程,所以我仍然发布它,希望它可以帮助其他人避免这种挫败感。我的解决方案如下。
4个回答

23

解决方案:

  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 之间:

  8. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    

解释:

解决问题的路径始于这个网站,该网站描述了一个在MAMP上的不同SSL错误,并建议重新编译带有
--prefix=/Applications/MAMP/Library/的全新cURL版本以覆盖MAMP使用的版本。我尝试了这个方法,但它没有起作用。后来,我研究了cURL编译选项,发现可以在编译过程中指定不同版本的OpenSSL的说明。我决定尝试一下(并承诺这是最后一次尝试,然后我会放弃)。我安装了一个最新的OpenSSL软件包(使用Homebrew),它的有用的安装后信息说:

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证书问题:无法获取本地签发者证书”)。将CURLOPT_SSL_VERIFYPEER设置为false解决了这个问题。


1
谢谢,这解决了我的问题。我在本地开发环境上苦苦挣扎了几天,一直遇到“error: 14077410: SSL routines: SSL23_GET_SERVER_HELLO: sslv3 alert handshake failure”错误,后来更新了我的SSL版本但没有与Mamp链接起来。这篇帖子为我连接了线索! - Dimitri Zetzsche
谢谢,这让我省去了几个小时的挫败感和头痛。我无法付款,但我会尽我最大的努力——给你一些积分。 - Matt Cole
非常感谢,我花了3天时间寻找解决方案,直到我按照您的指示尝试才成功。 - fenixkim
谢谢!运行得非常顺利。 - vovafeldman

1

这是在运行于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/zh/book.curl.php


值得注意的是,不幸的是,这只适用于您的系统具有某些较新版本的PHP和/或OpenSSL。 - Simon East

0

我通过更新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 file https ftps功能:GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz ~ $ openssl version OpenSSL 1.0.2m 2 Nov 2017


0

我曾经遇到过同样的问题。我通过使用苹果首选的SecureTransport SSL程序来解决它。以下是我的解决方法:

  1. 这里下载最新的curl(zip)版本
  2. 进入您的下载文件夹并通过双击zip文件来提取它。现在,您的下载文件夹中将有一个包含提取文件的文件夹。
  3. 打开终端并导航到该文件夹 `cd ~/Downloads/curl-folder-name'
  4. 然后在终端中键入./configure --prefix=/Applications/MAMP/Library/ --with-darwinssl
  5. 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"


我在使用Recurly API的应用程序中尝试了这个方法,但是得到了一个500响应,在php错误日志中没有任何内容。添加VERIFYPEER=false也没有解决问题。我需要同时包括设置VERIFYPEER setopt,并包括前一个解决方案中列出的configure命令的两个标志。 - efreed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接