我正在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,它工作得很好。我花了几个小时阅读并尝试了我在这个网站和其他地方找到的所有其他解决方案,但没有一个有效。还有人看到这个问题吗?
更新:在发布这个问题之前,我终于在我最后的努力中找到了一个解决方案,但这是一个如此痛苦的过程,我无论如何都要发布它,希望它能帮助别人避免这种头发撕裂的灾难。我的解决方案如下:
解决方案:
-
brew install openssl
- 下载并解包最新的cURL
-
cURL源目录:
LDFLAGS="-L/usr/local/opt/openssl/lib" CPPFLAGS="-I/usr/local/opt/openssl/include" ./configure --prefix=/Applications/MAMP/Library/
-
make
-
make install
- 重启MAMP
-
在PHP中,
curl_init
和curl_exec
之间:curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
解释:
找到解决方案的路径从这个站点开始,它描述了MAMP上的一个不同的SSL错误,并建议使用
重新编译新版本的cURL。--prefix=/Applications/MAMP/Library/
覆盖MAMP使用的。我试过了,但没有用。后来,有些事情驱使我去研究cURL编译选项,我注意到在编译时指定不同版本的OpenSSL的说明。我决定试一试(向自己保证这是最后一次尝试,然后我会放弃)。我在Homebrew中安装了一个最新的OpenSSL包,其有用的安装后信息说:
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/
,接着是通常的make
和make install
,重新启动了MAMP,松了一口气。
我后来发现,我从另一个网站输入的cURL选项之一也是必要的,以避免不同的SSL错误("SSL证书问题:无法获得本地颁发者证书")。将CURLOPT_SSL_VERIFYPEER
设置为false为我解决了这个问题。
这是一个适合我在OSX 10.11.1上运行的MAMP Pro 3.5的解决方案
在您的PHP中,您可能需要为curl_init()
设置SSL版本和匹配的Cipher:
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
我也遇到过同样的问题。我用苹果首选的SecureTransport SSL程序解决了这个问题。下面的方法对我有用:
- 从这里下载最新的curl (zip)版本
- 进入下载文件夹,双击解压zip文件。在你的下载文件夹中会有一个文件夹,里面有解压后的文件。
- 打开终端并导航到文件夹"cd ~/下载/curl-folder-name"
- 则终端类型为
./configure --prefix=/Applications/MAMP/Library/ --with-darwinssl
-
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-Negotiate IDN IPv6 Largefile NTLM SSL libz ~ $ OpenSSL version OpenSSL 1.0.2m 2017年11月2日