我在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,它工作正常。我花了几个小时阅读并尝试了我在本网站和其他地方找到的所有其他解决方案,但没有一个能够奏效。还有其他人看到过这个问题吗?
更新:在发布此问题之前,我终于在我的最后一次努力中找到了一个解决方案,但这是一个非常痛苦的过程,无论如何我都希望它可以帮助别人避免这头发撕裂的灾难。我的解决方案如下。
答案 0 :(得分:22)
解决方案:
brew install openssl
在cURL源目录中:
LDFLAGS="-L/usr/local/opt/openssl/lib" CPPFLAGS="-I/usr/local/opt/openssl/include" ./configure --prefix=/Applications/MAMP/Library/
make
make install
在PHP中,在curl_init
和curl_exec
之间:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
解释:
找到解决方案的路径以this site开头,它描述了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可以解决这个问题。
答案 1 :(得分:0)
这是一个适用于在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
答案 2 :(得分:0)
我遇到了同样的问题。我通过使用Apples首选的SecureTransport SSL程序解决了这个问题。以下对我有用:
./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"
答案 3 :(得分: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文件https ftps功能:GSS-协商IDN IPv6大文件NTLM SSL libz〜$ openssl版本OpenSSL 1.0.2m 2017年11月2日