当前位置: 首页 > 知识库问答 >
问题:

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

景星光
2023-03-14

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

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

警告: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/competies/?o=C35091BF-0F25-4C86-A5AA-C7714E38112C)[function.file-get-contents]:打开流失败

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

这里是我的代码片段,但如果我需要提供更多请让我知道。

//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

共有1个答案

傅自明
2023-03-14

问题似乎在于函数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);
 类似资料:
  • 我已经安装了WAMP3.0.4,并试图编写一个连接到外部HTTPS web服务的PHP脚本。但这将返回错误: 从上面可以清楚地看出,我是Apache/WAMP的新手。也许有人能解释一下我错过了什么吗?

  • 问题内容: 我正在通过SSL连接到数据库Google Cloud SQL。我使用codeigniter 3.0进行了此操作,尽管mysqli驱动程序进行了一些修改以允许此功能。 几个月来一直运作良好。但是,它 刚刚 开始返回此警告: 我认为这是主要问题,但我不知道那是什么意思。我已经搜索了Diffie- Hellman密钥交换以及“密钥太小”消息,但是运气不高。 这是否表明服务器上的密钥已被篡改?

  • 问题内容: 我一直试图从我在服务器上创建的PHP页面访问此特定的REST服务。我将问题缩小到这两行。所以我的PHP页面看起来像这样: 该页面死于第2行,并出现以下错误: * 警告:file_get_contents():SSL操作失败,代码为1。OpenSSL错误消息:error:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证在第2行的… php中失

  • null 我们用的是Gentoo服务器。我们最近升级到PHP版本5.6。这个问题是在升级之后出现的。 在前面的尝试中,我设置,并将其作为参数传递给file_get_contents,如下所述:file_get_contents忽略verify_peer=>false?但就像作者指出的那样;没什么区别。 我询问了一位服务器管理员,我们的php.ini文件中是否存在以下行: extension=php

  • 我是TLS/SSL的新手。我面临SSL/TLS连接的问题。 我可以在tcpdump跟踪中看到握手成功完成(clienthello、serverhello、certificate、certififcate请求、server hello done、client certificate、client key exchange、certificate verify、change cipher suite