我一直在尝试从我在服务器上创建的PHP页面访问这个特定的REST服务.我将问题缩小到这两行.所以我的PHP页面如下所示:
该页面在第2行死亡,并出现以下错误:
警告:file_get_contents():SSL操作失败,代码为1. OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败...第2行的php
警告:file_get_contents():无法在第2行的... php中启用加密
警告:file_get_contents(
https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json
):无法打开流:第2行的... php操作失败
我们正在使用Gentoo服务器.我们最近升级到PHP 5.6版.升级后出现此问题.
我发现,当我一个地址替换REST服务一样https://www.google.com
; 我的页面工作正常.
在我之前的一次尝试中,我将“verify_peer”=>false
其作为参数传递给file_get_contents,如下所述: file_get_contents忽略verify_peer => false? 但就像作者所指出的那样; 它没有任何区别.
我问过我们的服务器管理员是否存在php.ini文件中的这些行:
延长= php_openssl.dll
allow_url_fopen =开
他告诉我,因为我们在Gentoo上,openssl是在我们构建时编译的; 并且它没有在php.ini文件中设置.
我也证实这allow_url_fopen
是有效的.由于这个问题的专业性; 我没有找到很多帮助信息.有没有人遇到过这样的事情?谢谢.
你不应该只关闭验证.相反,你应该下载一个证书包,也许curl包会做什么?
然后你只需要把它放在你的web服务器上,给运行php权限的用户读取文件.那么这段代码应该适合你:
$arrContextOptions=array( "ssl"=>array( "cafile" => "/path/to/bundle/cacert.pem", "verify_peer"=> true, "verify_peer_name"=> true, ), ); $response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json", false, stream_context_create($arrContextOptions));
希望您尝试访问的站点的根证书位于curl包中.如果不是,则在获得站点的根证书并将其放入证书文件之前,这仍然无效.
我通过确保在我的机器上安装了OpenSSL然后将其添加到我的php.ini来修复此问题:
openssl.cafile=/usr/local/etc/openssl/cert.pem
您可以通过编写使用curl的自定义函数来解决此问题,如下所示:
function file_get_contents_curl( $url ) { $ch = curl_init(); curl_setopt( $ch, CURLOPT_AUTOREFERER, TRUE ); curl_setopt( $ch, CURLOPT_HEADER, 0 ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt( $ch, CURLOPT_URL, $url ); curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, TRUE ); $data = curl_exec( $ch ); curl_close( $ch ); return $data; }
然后只需使用file_get_contents_curl
而不是file_get_contents
每当您调用以https开头的网址时.
您基本上必须将环境变量SSL_CERT_FILE设置为从以下链接下载的ssl-certificate的PEM文件的路径:http://curl.haxx.se/ca/cacert.pem.
我花了很多时间来解决这个问题.
以下步骤将解决此问题,
从以下链接下载CA证书:https://curl.haxx.se/ca/cacert.pem
找到并打开php.ini
查找curl.cainfo
并粘贴下载证书的绝对路径.curl.cainfo ="C:\wamp\htdocs\cert\cacert.pem"
重启WAMP/XAMPP(apache服务器).
有用!
希望有所帮助!!
这是一个非常有用的链接,可以找到:
http://php.net/manual/en/migration56.openssl.php
一个官方文档描述了在PHP 5.6中打开ssl所做的更改从这里我学到了另一个我应该设置为false的参数:"verify_peer_name"=> false
所以我的工作代码如下所示:
<?php $arrContextOptions=array( "ssl"=>array( "verify_peer"=>false, "verify_peer_name"=>false, ), ); $response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json", false, stream_context_create($arrContextOptions)); echo $response; ?>
为我工作,我正在使用PHP 5.6。应该启用openssl扩展名,并在调用google map api verify_peer时使false以下代码对我有用。
<?php $arrContextOptions=array( "ssl"=>array( "verify_peer"=>false, "verify_peer_name"=>false, ), ); $url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" . $latitude . "," . $longitude . "&sensor=false&key=" . Yii::$app->params['GOOGLE_API_KEY']; $data = file_get_contents($url, false, stream_context_create($arrContextOptions)); echo $data; ?>
如果您的PHP版本是5,请尝试通过在终端中键入以下命令来安装cURL:
sudo apt-get install php5-curl
由于我遇到了同样的问题,我只是想补充一下,在任何地方都找不到任何东西(例如,下载cacert.pem文件,在php.ini中设置cafile等)。
如果您使用的是NGINX,并且SSL证书随附“中间证书”,则需要将中间证书文件与主“ mydomain.com.crt”文件组合在一起,并且文件应该可以正常工作。Apache有一个专门针对中间证书的设置,但是NGINX没有,因此它必须与常规证书位于同一文件中。