我在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 install
>重启MAMP
>在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可以解决这个问题.