如何使file_get_contents()与HTTPS一起使用?


106

我正在设置信用卡处理程序,需要对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);
}

Answers:


89

请尝试以下脚本,以查看您的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', "\n";
echo 'wrappers: ', var_export($w);

输出应该是这样的

openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(11) {
  [...]
}

@volker这就是为什么我要allow_url_fopen
Gordon

好吧,奇怪的是它说openssl已关闭,但是根据phpinfo(),它是用它编译的,除非我看错了。
詹姆斯·辛普森

phpinfo()在configure-line中告诉您,还是有一整节叫做“ OpenSSL”?
VolkerK,2009年

好的,它只是在配置行中,而不是它的一部分。我想那是问题吗?
詹姆斯·辛普森,

我拥有所有这些,但仍然无法正常工作。然后allow_url_fopen。只有非https网址才能在本地主机上运行。
柯蒂斯,

116

要允许https包装器:

  • php_openssl扩展名必须存在并已启用
  • allow_url_fopen 必须设置为 on

如果不存在,请在php.ini文件中添加以下行:

extension=php_openssl.dll

allow_url_fopen = On

在我的安装中,两者都设置为“开”,但是我仍然收到SSL错误“警告:file_get_contents():SSL:握手超时”
Adamantus

53

尝试以下方法。

function getSslPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

注意:这将禁用SSL验证,这意味着HTTPS提供的安全性已丢失。仅将此代码用于测试/本地开发,而不要在Internet或其他面向公众的网络上使用。如果此代码有效,则表明SSL证书不受信任或无法验证,您应将其作为单独的问题进行修复。


29
为什么在处理信用卡处理时会禁用SSL验证?
彼得

谢谢,诀窍就在这里:curl_setopt($ ch,CURLOPT_SSL_VERIFYPEER,FALSE);
Dylan B

46
$url= 'https://example.com';

$arrContextOptions=array(
      "ssl"=>array(
            "verify_peer"=>false,
            "verify_peer_name"=>false,
        ),
    );  

$response = file_get_contents($url, false, stream_context_create($arrContextOptions));

无论它是HTTPS,这都将允许您从URL获取内容。


谢谢!这对我有效。一直在尝试调用FB Open Graph API :)
解码

我只是为了测试目的而尝试使用无效证书访问我的域,即使这禁用了SSL验证,这也是我所需要的。
卡拉

大!我已经尝试了5天,使用file_get_contents在我的XAMPP测试站点上下载了airbnb日历,这解决了问题,谢谢。
JohnnyBeGood

为我工作,试图通过https连接到没有有效HTTP证书的Vagrant测试盒。链接到此处设置的PHP SSL上下文选项:php.net/manual/en/context.ssl.php ; 验证对等体=要求验证所使用的SSL证书;verify_peer_name =需要验证对等名称。
安东尼

这不是打破SSL认证的安全漏洞吗?
webchun

10

这可能是由于您的目标服务器没有有效的SSL证书。


请求服务器不需要SSL证书。
ceejayoz

15
我没有说请求服务器,而是说目标服务器。
EmilVikström'09 / 12/29

2
那会教我略读。h!请接受我的道歉和支持。
ceejayoz

目标服务器确实具有有效的SSL证书。
詹姆斯·辛普森

@James,如果尝试使用cURL连接,会收到错误消息吗?还是绝对不可能尝试?
EmilVikström,2009年


5

我有同样的错误。设置allow_url_include = Onphp.ini固定对我来说。


5

如果已编译为支持OpenSSL,则从PHP 4.3.0开始支持HTTPS。另外,请确保目标服务器具有有效的证书,防火墙允许出站连接,并且allow_url_fopen在php.ini中将其设置为true。


我有支持OpenSSL的PHP​​ 5.2.8。我与此同时遇到相同的错误,并且目标服务器具有有效的证书。
詹姆斯·辛普森

2
防火墙是否配置为允许出站https连接?通常,运行https的网络服务器不在端口80上运行。除了“无法打开流”之外,错误中还有其他内容吗?
戈登

1
据我所知,这是整个错误:警告:fopen(https:// ...)[function.fopen]:无法打开流:/ home / user / public_html /中没有此类文件或目录test.php 993行
詹姆斯·辛普森,

并将php.ini中的allow_url_fopen设置为什么?
戈登

真奇怪 您可以在HTTP和HTTPS网址上执行GET来查看是否可行吗?没有流上下文?
戈登

3

在我的情况下,问题是由于WAMP针对CLI使用的是与Apache不同的php.ini而导致的,因此通过WAMP菜单进行的设置不适用于CLI。只需修改CLI php.ini即可。


1

有时,服务器会根据它在http请求标头(例如适当的用户代理)中看到或未看到的内容选择不响应。如果可以连接浏览器,请抓住它发送的标题并在流上下文中模拟它们。


0

我在IIS上无法正常使用https。解决:

file_get_contents('https ..)将不会加载。

  • 下载https://curl.haxx.se/docs/caextract.html
  • 在..phpN.N / extras / ssl下安装
  • 使用以下命令编辑php.ini:

    curl.cainfo =“ C:\ Program Files \ PHP \ v7.3 \ extras \ ssl \ cacert.pem” openssl.cafile =“ C:\ Program Files \ PHP \ v7.3 \ extras \ ssl \ cacert.pem”

最后!


-1

检查网址是否正常

您问题中的代码可以重写为工作版本:

function send($packet=NULL, $url) {
// Do whatever you wanted to do with $packet
// The below two lines of code will let you know if https url is up or not
$command = 'curl -k '.$url;
return exec($command, $output, $retValue);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.