PHP file_get_contents() SSL 操作失败,代码为 1

Posted

技术标签:

【中文标题】PHP file_get_contents() SSL 操作失败,代码为 1【英文标题】:PHP file_get_contents() SSL operation failed with code 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

【问题讨论】:

它不是你的证书。似乎另一端升级了一些东西(可能是允许的密码),而你的一端跟不上 ***.com/questions/16547163/… 这有点过头了,但是我无能为力吗? 你运行的是什么版本的 PHP 非常感谢 @RiggsFolly 让我查看 PHP 版本。我更新到 PHP 版本:5.4.19,它仍然不是最新的,但这解决了我的这个错误问题,并且没有破坏我的任何其他 php 代码。 【参考方案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 选项吗?我也喜欢它,这将是我的理解。 - 尤其是在这个问题的背景下。

以上是关于PHP file_get_contents() SSL 操作失败,代码为 1的主要内容,如果未能解决你的问题,请参考以下文章

PHP将'file_get_contents'分解为数组

PHP 将变量发送到 file_get_contents()

php中的file_get_contents或curl?

file_get_contents 通过 php 失败,通过浏览器工作

php PHP Image出力(file_get_contents)

C# 相当于 file_get_contents (PHP)