通过https:SSL3\u GET\u SERVER\u证书用php加载外部xml文件时出错

通过https:SSL3\u GET\u SERVER\u证书用php加载外部xml文件时出错,php,xml,Php,Xml,我无法获取要加载的xml文件 此代码非常有效: $url = 'http://www.w3schools.com/xml/note.xml'; $xml = simplexml_load_file($url); print_r($xml); 但是这个 $url = 'https://www.boardgamegeek.com/xmlapi2/thing?id=105551'; $xml = simplexml_load_file($url); print_r($xml); 不起作用。我得到这

我无法获取要加载的xml文件

此代码非常有效:

$url = 'http://www.w3schools.com/xml/note.xml';
$xml = simplexml_load_file($url);
print_r($xml);
但是这个

$url = 'https://www.boardgamegeek.com/xmlapi2/thing?id=105551';
$xml = simplexml_load_file($url);
print_r($xml);
不起作用。我得到这个错误:

警告:simplexml_load_file():SSL操作失败,代码为1。OpenSSL错误消息:错误:14090086:SSL例程:SSL3_获取_服务器_证书:证书验证在第19行的/storage/content/59/113059/boardgamelevelup.com/public_html/index.php中失败警告:simplexml_load_file():无法在第19行的/storage/content/59/113059/boardgamelevelup.com/public_html/index.php中启用加密警告:simplexml_load_file():无法打开流:第19行的/storage/content/59/113059/boardgamelevelup.com/public_html/index.php中的操作失败警告:simplexml_load_file():I/O警告:无法加载外部实体“”在第19行的/storage/content/59/113059/boardgamelevelup.com/public_html/index.php中

boardgamegeek的xml文件在其他网站上也可以使用。我应该使用不同的php代码加载该xml文件吗?

简短的食谱回答:

  • 下载并将该文件放在服务器上
  • $context = stream_context_create(array('ssl'=>array( 'verify_peer' => true, 'cafile' => '/path/to/ca-bundle.crt' ))); libxml_set_streams_context($context); $context=stream\u context\u create(数组('ssl'=>array( “验证对等体”=>true, “cafile'=>”/path/to/ca bundle.crt” ))); libxml\u set\u streams\u context($context) 在simplexml_load_file()之前执行脚本。
    或者-而不是上面的代码-在php.ini中设置
    openssl.cafile=/path/to/ca bundle.crt

    非常简短的解释:
    您的php版本使用openssl处理https传输。openssl试图验证服务器是否真的是它声称的那个人。它通过检查其证书是否可信来实现这一点。X.509证书包含有关所有者的一些数据,并由颁发者签名(其本身具有再次签名的证书,依此类推,直到拥有者和颁发者相同的证书->自签名/根证书)。如果在证书链中存在(至少)一个openssl“表示”的证书,则该证书被视为“受信任的”:“好的,我已被指示信任此证书”。此说明的形式是(或可以是)“这是一个包含您应该信任的证书的文件”(cafile)。
    上面的代码告诉php的libxml包装器,当simplexml加载文件使用https/openssl包装器时,告诉openssl该文件在哪里。
    openssl.cafile=/path/to/ca bundle.crt
    只是将其设置为默认值;除非另有指示,否则所有openssl操作都将使用该文件,包括libxml/simple\u xml\u loadfile

    我链接到的ca-bundle.crt来自一个项目,该项目“声称”提供mozilla firefox附带的提取根证书。关于“声明”:我没有理由怀疑这真的是未受限制的根证书列表;但你永远不会知道:你把你的信任a)放在这个项目中,b)mozilla做得很好,只把值得信赖的证书放在那个列表中


    有关更多解释,请参见@VolkerK展示的作品和示例,它们既优秀又简单。 虽然这种方法对我不起作用,但我更进一步,暂时基本上取消了安全性

    $context = stream_context_create(array('ssl'=>array(
        'verify_peer' => false, 
        "verify_peer_name"=>false
        )));
    
    libxml_set_streams_context($context);
    
    $sxml = simplexml_load_file($webhostedXMLfile);
    
    是的,这是一种不好的做法,但有时您需要临时修复,而不是像这样的消息:

    警告:simplexml_load_file():SSL操作失败,代码为1。 OpenSSL错误消息:错误:14090086:SSL 例程:SSL3\u获取\u服务器\u证书:中的证书验证失败 /srv/www/resources/public_html/files/etc/file.php第150行警告: simplexml_load_file():无法在中启用加密 /第150行的srv/www/resources/public_html/files/etc/file.php


    我希望这对其他人有所帮助。

    您的web服务器配置可能存在SSL问题。非常感谢VolkerK!成功了。也谢谢你的解释,这有助于理解问题。非常感谢。它确实救了我