【问题标题】:PHP file_get_contents() SSL operation failed with code 1PHP file_get_contents() SSL 操作失败,代码为 1
【发布时间】:2021-05-14 08:43:45
【问题描述】:

我想用“我是个白痴”作为这个问题的开头,但我真的需要一些帮助。

我有一个由 GoDaddy 托管的 PHP 站点。在过去的几年里,我一直在使用 file_get_contents() 将一个简单的 XML 页面读入我网站的 mySQL 数据库中。今年 1 月,我开始收到以下警告。

警告:file_get_contents() [function.file-get-contents]:SSL 操作失败,代码为 1。OpenSSL 错误消息:错误:14077410:SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报握手失败

警告:file_get_contents() [function.file-get-contents]:无法启用加密

警告:file_get_contents(https://api.competitionsuite.com/2013-02/Competitions/?o=C35091BF-0F25-4C86-A5AA-C7714E38112C) [function.file-get-contents]:打开流失败

在此之前我没有该网站的 SSL 证书,因此我从 GoDaddy 购买了基本证书,希望这可以解决错误,但即使在 HTTPS 网站上我也会遇到相同的错误。

这是我的代码的 sn-p,但如果我需要提供更多信息,请告诉我。

//read XML
$url = 'https://api.competitionsuite.com/2013-02/Competitions/?o=C35091BF-0F25-4C86-A5AA-C7714E38112C';
$context  = stream_context_create(array('http' => array('header' => 'Accept: application/xml')));
                            
$xml = file_get_contents($url, false, $context);
$xml = simplexml_load_string($xml);

如果有人有空闲时间,我真的可以使用一些指导。 TIA

【问题讨论】:

  • 它不是你的证书。似乎另一端升级了一些东西(可能是允许的密码),而你的一端跟不上
  • 这有点过头了,但是我无能为力吗?
  • 你运行的是什么版本的 PHP
  • 非常感谢 @RiggsFolly 让我查看 PHP 版本。我更新到 PHP 版本:5.4.19,它仍然不是最新的,但这解决了我的这个错误问题,并且没有破坏我的任何其他 php 代码。

标签: php xml ssl simplexml file-get-contents


【解决方案1】:

问题似乎在于函数file_get_contents(..) 不能以简单的方式与 SSL(https 网站)一起使用。

简单的解决方案:

你可以像这样创建函数 - 你只需要在 PHP 中启用curl 扩展。

function file_get_contents_ssl($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);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3000); // 3 sec.
    curl_setopt($ch, CURLOPT_TIMEOUT, 10000); // 10 sec.
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

它的工作原理类似于函数file_get_contents(..)

例子:

echo file_get_contents_ssl("https://www.example.com/");

输出:

<!doctype html>
<html>
<head>
    <title>Example Domain</title>
...

那么你的代码应该这样工作:

//read XML
$url = 'https://api.competitionsuite.com/2013-02/Competitions/?o=C35091BF-0F25-4C86-A5AA-C7714E38112C';
                            
$xml = file_get_contents_ssl($url);
$xml = simplexml_load_string($xml);

【讨论】:

  • 谢谢你。我更新了我的 php 版本,这使得我的原始代码可以正常工作,但你认为更新我的代码以使用 curl 代替是明智的吗?
  • @LanceEngland 根据我的经验,CURL 是下载 https url 的最简单方法。但肯定有更安全(但更复杂)的方法来做到这一点。
  • @Martin:如果你喜欢 curl,为什么要用 CURLOPT_SSL_VERIFYPEER 之类的库覆盖默认设置,从而降低连接的属性?
  • @hakre 为什么你认为如果我更改某些库的默认值会降级?我使用默认值 = 我喜欢它&我不使用默认值 = 我不喜欢它?
  • @Martin:这是关于将CURLOPT_SSL_VERIFYPEER 设置为FALSE,这会影响库维护人员对这些(重要)设置的工作。这与你是否不喜欢它无关。旁边我不是告诉你喜欢什么的人,所以这是毫无疑问的,这只是 CURLOPT_SSL_VERIFYPEER 设置,我很感兴趣将其设置为非默认值的好处你的意见。将其设置为 FALSE 不会降低 curl 选项吗?我也喜欢它,这将是我的理解。 - 尤其是在这个问题的背景下。
猜你喜欢
  • 2015-04-27
  • 1970-01-01
  • 2016-12-19
  • 2014-11-26
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
相关资源
最近更新 更多