天道酬勤,学无止境

file_get_contents 忽略了 verify_peer=>false?(file_get_contents ignoring verify_peer=>false?)

问题

带有 https 主机的 file_get_contents 工作正常,但特定主机除外(来自某些公司的测试 api 服务器 - ip 列入白名单,无法为您提供 URL 进行测试)。 这排除了未加载的 https 模块和其他初始设置错误。

我已经对多个 PHP 安装进行了测试,所有版本均为 v5.3.3、32 位、Debian 32 位。

该请求适用于 cURL,但curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);是设置curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); . 但是,在 file_get_contents 的上下文中设置verify_peer"=>false似乎没有区别。

使用 file_get_contents,完全相同的请求(相同的 URL,相同的 XML POST 数据)因SSL失败:连接由 peer 重置

$arrContextOptions=array(
    "http" => array(
        "method" => "POST",
        "header" => 
            "Content-Type: application/xml; charset=utf-8;\r\n".
            "Connection: close\r\n",
        "ignore_errors" => true,
        "timeout" => (float)30.0,
        "content" => $strRequestXML,
    ),
    "ssl"=>array(
        "allow_self_signed"=>true,
        "verify_peer"=>false,
    ),
);

file_get_contents("https://somedomain:2000/abc/", false, stream_context_create($arrContextOptions));

.

有没有人在 file_get_contents 中遇到过这个问题? 任何想法如何调试?

回答1

你错过了verify_peer_name 。 如果您也将其设置为 false,则请求有效:

$arrContextOptions=array(
    "http" => array(
        "method" => "POST",
        "header" => 
            "Content-Type: application/xml; charset=utf-8;\r\n".
            "Connection: close\r\n",
        "ignore_errors" => true,
        "timeout" => (float)30.0,
        "content" => $strRequestXML,
    ),
    "ssl"=>array(
        "allow_self_signed"=>true,
        "verify_peer"=>false,
        "verify_peer_name"=>false,
    ),
);

file_get_contents("https://somedomain:2000/abc/", false, stream_context_create($arrContextOptions));
回答2

不知道这是否真的有帮助,但请尝试从您的选项数组中删除SSL选项。

这背后的原因:根据 http://www.php.net/manual/en/context.ssl.php , verify_peer默认为false

allow_self_signed需要verify_peer ,默认为false

从上面,我认为allow_self_signed可能会覆盖您对verify_peer的设置。

因此,请尝试不使用SSL任何选项,或不使用allow_self_signed ,并让我们知道这是否有帮助。

回答3

您可以尝试使用 Wireshark 进行调试——您可能会更好地了解出了什么问题,您应该看到发生了哪个 SSL 错误。

回答4

试试这个代码:

$fp = fsockopen("ssl://somedomain/abc/", 2000 , $ErrNo, $ErrString, 30);
if (!$fp) {
    echo "Error No : $ErrNo - $ErrString <br />\n";
} else {
    $out  = "POST / HTTP/1.1\r\n";
    $out .= "Host: somedomain \r\n";
    $out .= "Content-Type: application/xml; charset=utf-8;\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}

如果您没有收到错误,我认为问题(file_get_contents)是表单客户端 php 配置,否则来自服务器配置。

回答5

只安装这个

yum install ca-certificates.noarch
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • file_get_contents ignoring verify_peer=>false?
    file_get_contents with https hosts works just fine, except for a particular host (test api server from some company - ip whitelisted, can't give you URL to test). This rules out not loaded https modules and other initial setup mistakes. I have tested with multiple PHP installations, all at v5.3.3, 32bits, Debian 32bits. The request works with cURL, but only if setting curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);. However, setting verify_peer"=>false on the context for file_get_contents seems to make no difference. With file_get_contents, the exact same request (same URL, same XML POST data)
  • file_get_contents():对等证书不匹配(file_get_contents(): Peer certificate did not match)
    问题 我使用了 PHP 5.5,但我不得不更新它,现在我使用的是 PHP 5.6.19。 现在,当我尝试与外部 API 通信时,我收到警告: 警告:file_get_contents():对等证书 CN= *.domain.com' did not match expected CN= .domain.com' *.domain.com' did not match expected CN= api.domain.com' *.domain.com' did not match expected CN= 它没有出现在以前的 PHP 版本中。 $encryptedEncodedData // this is json encoded //array, then encrypted by mcrypt with rijndael-128 and finally bin2hex. $context = stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => 'Content-Type: application/json', 'content' => $encryptedEncodedData, ) )); $api = 'https://api.domain.com/service';
  • 在 GAE 上使用 file_get_contents 无效标头问题(Using file_get_contents invalid headers issue on GAE)
    问题 我正在使用 php 开发谷歌应用程序。 我需要使用 Podio-php API 从 Podio 使用 REST 服务。 但它使用 cURL,我知道 GAE 不允许这样做。 所以我尝试通过 curl 模拟器调整 podio-php 库以使用 file_get_contents。 在本地工作正常,但是当我部署它时,没有任何效果。 我收到此错误消息: 警告:file_get_contents(https://api.podio.com:443/oauth/token):无法打开流:无效的标头。 必须是字符串。 在 /base/data/home/apps/s~wt-project1/9.374066902612513343/static/curlEmulator.php 第 167 行 然后,我没有得到任何回应,它破坏了所有的应用程序。 任何人都知道问题来自哪里? 这是电话: $options = array( "ssl"=>array( "allow_self_signed"=>true, "verify_peer"=>false, ), 'http' => array( 'method' => $method, 'header' => $this->getValue(CURLOPT_HTTPHEADER), 'content' => $content ) ); $context
  • file_get_contents() 突然不工作(file_get_contents() suddenly not working)
    问题 这是我所有的代码: <html> <body> <form> Playlist to Scrape: <input type="text" name="url" placeholder="Playlist URL"> <input type="submit"> </form> <?php if(isset($_GET['url'])){ $source = file_get_contents($_GET['url']); $regex = '/<a href="(.*?)" class="gothere pl-button" title="/'; preg_match_all($regex,$source,$output); echo "<textarea cols=100 rows=50>"; $fullUrl = array(); foreach($output[1] as $url){ array_push($fullUrl,"http://soundcloud.com".$url); } $final = implode(";",$fullUrl); echo $final; echo "</textarea>"; }else{ echo "borks"; } ?> </body> </html> 昨天,它运行良好。 代码应该做的是:获取一个 Soundcloud
  • PHP file_get_contents忽略超时?(PHP file_get_contents ignoring timeout?)
    问题 $url = 'http://a.url/i-know-is-down'; //ini_set('default_socket_timeout', 5); $ctx = stream_context_create(array( 'http' => array( 'timeout' => 5, 'ignore_errors' => true ) ) ); $start = microtime(true); $content = @file_get_contents($url, false, $ctx); $end = microtime(true); echo $end - $start, "\n"; 我得到的响应通常是21.232段,应该不是大约5秒钟??? 取消注释ini_set行根本没有帮助。 回答1 您正在使用socket_create_context设置读取超时。 如果您尝试访问的页面不存在,则服务器将允许您连接并给您404。但是,如果该网站不存在(无法解析或网站背后没有网络服务器),则file_get_contents()将忽略读取超时,因为它甚至还没有超时连接到它。 我认为您不能在file_get_contents设置连接超时。 我最近重写了一些使用fsockopen()代码,正是因为它允许您指定连接超时 $connTimeout = 30 ; $fp =
  • 忽略 file_get_contents HTTP 包装器中的错误?(Ignoring errors in file_get_contents HTTP wrapper?)
    问题 以下代码用于查询我作为大学项目构建的搜索引擎的在线同义词库,但我遇到了file_get_contents “无法打开流”错误的问题。 当我发送同义词库无法识别的单词时,它会引发错误。 我正在尝试编写一段代码,该代码将忽略错误并在没有信息的情况下继续进行。 $thesaurus_search="http://words.bighugelabs.com/api/2/0089388bb57f/".$this->formatted_query."/php"; $result_thesaurus=file_get_contents($thesaurus_search); 我试过: if (file_get_contents($thesaurus_search) != NULL) { // do stuff } ...但它不起作用,因为它仍然返回某种字符串。 我能做些什么来处理这种情况? 回答1 如果您不希望file_get_contents将HTTP 错误报告为 PHP 警告,那么这是一种干净的方法,使用流上下文(有一些专门用于此的内容): $context = stream_context_create(array( 'http' => array('ignore_errors' => true), )); $result = file_get_contents('http:/
  • 如何使file_get_contents()与HTTPS一起使用?(How to get file_get_contents() to work with HTTPS?)
    问题 我正在设置信用卡处理程序,需要对CURL使用替代方法。 当我使用测试服务器(未调用SSL URL)时,以下代码可以正常工作,但是现在当我在使用HTTPS的工作服务器上对其进行测试时,它失败,并显示错误消息“无法打开流”。 function send($packet, $url) { $ctx = stream_context_create( array( 'http'=>array( 'header'=>"Content-type: application/x-www-form-urlencoded", 'method'=>'POST', 'content'=>$packet ) ) ); return file_get_contents($url, 0, $ctx); } 回答1 请尝试以下脚本,以查看您的php脚本是否有https包装器。 $w = stream_get_wrappers(); echo 'openssl: ', extension_loaded ('openssl') ? 'yes':'no', "\n"; echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n"; echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "
  • 警告:file_get_contents:无法打开流:达到重定向限制,正在中止(Warning: file_get_contents: failed to open stream: Redirection limit reached, aborting)
    问题 我在该网站上阅读了20多个相关问题,但在Google上进行了搜索,但没有用。 我是PHP的新手,正在使用PHP Simple HTML DOM解析器来获取URL。 虽然此脚本适用于本地测试页,但不适用于我需要该脚本的URL。 这是我为此编写的代码,下面是PHP Simple DOM解析器库随附的示例文件: <?php include('simple_html_dom.php'); $html = file_get_html('http://www.farmersagent.com/Results.aspx?isa=1&name=A&csz=AL'); foreach($html->find('li.name ul#generalListing') as $e) echo $e->plaintext; ?> 这是我收到的错误消息: Warning: file_get_contents(http://www.farmersagent.com/Results.aspx?isa=1&name=A&csz=AL) [function.file-get-contents]: failed to open stream: Redirection limit reached, aborting in /home/content/html/website.in/test/simple_html
  • file_get_contents(): SSL operation failed with code 1 (certificate verify failed)
    I have installed WAMP 3.0.4 and am trying to write a PHP script that connects to an external HTTPS web service. But this returns the error: Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed I have written a short script that demonstrates the issue: <?php $auth = base64_encode('username:password'); $aContext = array( 'http' => array( 'proxy' => 'tcp://proxyip:proxyport', 'request_fulluri' => true, 'header' => 'Proxy-Authorization: Basic $auth' ), 'SSL' => array( 'verify_peer'
  • PHP 函数 getimagesize() 在尝试获取 https url 时给出“读取错误”(PHP function getimagesize() gives “Read error” when trying to get https url)
    问题 我正在尝试将 getimagesize 与 URL 和 http 一起使用,一切都很好。 但是,当尝试在 https url 上使用函数时,我收到“读取错误”通知,结果为 false。 我检查过,我在服务器上安装了 OpenSSL 0.98(所以它也应该与 https 一起使用)。 我知道我可以先下载图像然后使用它,但在我看来这应该可行并且我遗漏了一些东西。 你能给我提供一些解决方案吗(除了先下载图像然后打开它)? 先感谢您。 回答1 您可以使用file_get_contents()作为替代解决方案.. <?php $filename='something'; file_put_contents($filename,file_get_contents($url)); $size = getimagesize($filename); var_dump($size); 回答2 当您不更改任何 SSL 设置时,使用 file_get_contents() 只会转移问题而不是解决问题。 但是您可以通过 stream_context_create 实现这一点,然后摆弄 SSL 设置。 一旦你这样做了,你也可以通过 SSL 想要保护你的东西。 <?php error_reporting( E_ALL ); header( 'Content-type: text/plain' ); //
  • file_get_contents(): 无法定位证书 CN(file_get_contents(): Unable to locate certificate CN)
    问题 我们有两个域(都是 https):一个作为主域 https://dev.project.com/,另一个用于图像 https://dev-images.project.com/。 首页加载图像就好了,但我在file_get_contents遇到了这个问题。 ErrorException in Collection.php line 228: file_get_contents(): Unable to locate certificate CN in Collection.php line 228 at HandleExceptions->handleError('2', 'file_get_contents(): Unable to locate certificate CN', '') at file_get_contents('https://dev-images.project.com/images/12012_resized.jpg') in Collection.php line 228 文件本身存在并在浏览器中签入时打开。 我检查了这个解决方案,但所有的测试都是积极的: openssl: yes http wrapper: yes https wrapper: yes wrappers: array (size=12) ... 配置文件 extension
  • file_get_contents 因空异常而失败(file_get_contents fails w/ empty exception)
    问题 我有一个奇怪的 file_get_contents 行为。 我们在代理后面,所以我需要设置 file_get_contents 的上下文。 奇怪的是,在我的 PC 上它工作正常,但在其他 PC 或其他位置它无法工作,遇到 max_execution_time 超时。 if ($requestType == 'GET') { $context = [ 'http' => [ 'method' => 'GET', 'header' => "Authorization: " . dbQueryHelper::getApiKey () . "\r\n" . "Content-Type: application/x-www-form-urlencoded\r\n", 'proxy' => getenv ( 'PROXY' ), 'request_fulluri' => true ], 'ssl' => array( 'SNI_enabled' => false, // Disable SNI for https over http proxies 'proxy' => getenv('PROXY'), 'request_fulluri' => true, "verify_peer"=>false, "verify_peer_name"=>false, ) ]; } $context =
  • OPENSSL file_get_contents():无法启用加密(OPENSSL file_get_contents(): Failed to enable crypto)
    问题 我正在建立一个个人库存平台(未分发)。 我想要的一个组件是此页面上的EPS图: https://eresearch.fidelity.com/eresearch/evaluate/fundamentals/earnings.jhtml?stockspage=earnings&symbols=AAPL&showPriceLine=yes 如您所见,该页面为https ,因此经过几天的努力,我启用了openssl ,现在它似乎适用于所有https页面,例如facebook和twitter的主页,但是对于我所用的页面仍然无效需要。 file_get_contents('https://facebook.com'); /* works */ file_get_contents('https://twittercom'); /* works */ file_get_contents('https://eresearch.fidelity.com/eresearch/evaluate/fundamentals/earnings.jhtml?stockspage=earnings&symbols=AAPL&showPriceLine=yes'); 我收到警告: Warning: file_get_contents(): SSL: crypto enabling timeout in C
  • file_get_contents() 和 Curl(file_get_contents() and Curl)
    问题 我在我的 laravel 4.2 代码中使用 file_get_contents() php 函数在通过 facebook 登录后获取个人资料照片。 当我使用它时它工作正常 $arrContextOptions=array( "ssl"=>array( "verify_peer"=> false, "verify_peer_name"=> false, ), ); $content = file_get_contents($myurl, false, stream_context_create($arrContextOptions)); 但它会在系统中产生一个安全漏洞,正如之前在另一个问题中针对同一问题所提到的,如果我不使用这种安全漏洞方法,错误就会出现在我的脸上,我无法处理 ErrorException (E_WARNING) HELP file_get_contents():SSL 操作失败,代码为 1。OpenSSL 错误消息:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败” 然后我尝试了 Curl 方法 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$myURL); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1)
  • file_get_contents 在服务器上不工作,但在本地机器上工作正常(file_get_contents not working on the server but working fine on local machine)
    问题 我有一个 php 脚本,它调用 Web 服务来检索 json 数据,该脚本在我的本地机器上运行良好,但在在线服务器上不起作用,它返回空字符串 $url = "https://magentoorders.elarabygroup.com/Service.asmx/AvailableToPromise"; try { $contextOptions = array( 'http' => array( 'method' => "POST", 'timeout' => 500, 'header' => "Accept-language: en\r\n" . "Content-Type: application/json\r\n". "Content-Length: 0" ) ); $context = stream_context_create($contextOptions); var_dump(file_get_contents($url, false, $context)); } catch (Exception $e) { } 回答1 您需要检查您的服务器是否允许 file_get_contents() 打开 URL。 检查您的 php.ini 或服务器配置中的allow_url_fopen是否设置为 true。 您可以查看此链接以获得更多帮助 手册中的信息 allow
  • file_get_contents() 不工作(file_get_contents( ) not working)
    问题 我有一个使用file_get_contents()从远程服务器获取 json 响应的脚本。 虽然file_get_contents()在本地文件上正常工作但不能使用 http 或 https 它给我以下错误file_get_contents(): http:// wrapper is disabled in the server configuration by allow_url_fopen=0 in and file_get_contents(https://api.domain.com/resolve.json?url=blablabla): failed to open stream: no suitable wrapper could be found ..它是一个专用服务器,我有 WHM..我试过了 在 WHM PHP 配置编辑器上设置allow_url_fopen = on但这不起作用。 在发生错误的目录中使用allow_url_fopen = on创建一个 php.ini 文件,但这不起作用。 添加ini_set('allow_url_fopen', 'On'); 到 PHP 脚本的开头,但这不起作用。 我知道我可以使用 Curl 代替,但我想知道为什么这不起作用..脚本在其他服务器和本地主机上正常工作 更新 : phpinfo(); 给我 allow_url
  • file_get_contents() and Curl
    I am using file_get_contents() php function in my laravel 4.2 code to get profile photo after login through facebook . it worked correctly when I use this $arrContextOptions=array( "ssl"=>array( "verify_peer"=> false, "verify_peer_name"=> false, ), ); $content = file_get_contents($myurl, false, stream_context_create($arrContextOptions)); but it makes a security hole in the system as mentioned before in another question for the same issue , if I dont use this security hole method , error blows up in my face which I cannot handle ErrorException (E_WARNING) HELP file_get_contents(): SSL operation
  • file_get_contents fails w/ empty exception
    I have a strange behaviour of file_get_contents. We are behind a proxy, so I needed to set the context of file_get_contents. The strange thing is, on my PC it works fine, but on other PC or at other location it won't work, running into the max_execution_time timeout. if ($requestType == 'GET') { $context = [ 'http' => [ 'method' => 'GET', 'header' => "Authorization: " . dbQueryHelper::getApiKey () . "\r\n" . "Content-Type: application/x-www-form-urlencoded\r\n", 'proxy' => getenv ( 'PROXY' ), 'request_fulluri' => true ], 'ssl' => array( 'SNI_enabled' => false, // Disable SNI for https over
  • PHP H5微信授权
    <?php /** * Created by PhpStorm. * User: wudi * Date: 2019/1/28 * Time: 10:31 */ namespace app\index\controller; use app\BaseController; use think\facade\view; use think\facade\DB; class Wxgetuserinfo extends BaseController { /** * 调用方法 * 具体参考tp5的命名空间 https://www.kancloud.cn/manual/thinkphp5/118014 * $class = new \app\card\controller\Wxgetuserinfo(); * $class->index(); */ /** * 1、获取用户信息 */ public function delsession() { session('userinfo', null); } public function index() { $appid = config('user.appid'); $secret = config('user.secret'); if (!session('userinfo')) { if (!isset($_GET['code'])) {
  • Using file_get_contents invalid headers issue on GAE
    I'm developping a google app using php. I need to consume REST service from Podio using the Podio-php API. But it uses cURL and I know it's not allowwed on GAE. So I tried tweaking the podio-php lib to use file_get_contents through a curl Emulator. Works fine locally, but when I deploy it, nothing works. I get this error message: Warning: file_get_contents(https://api.podio.com:443/oauth/token): failed to open stream: Invalid headers. Must be a string. in /base/data/home/apps/s~wt-project1/9.374066902612513343/static/curlEmulator.php on line 167 And then, I get no responses and it breaks all