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

文件\u获取\u内容:无法设置本地证书链文件

洪经义
2023-03-14

我们正在使用composer用Satis升级依赖项。在最近的服务器升级之后,我们无法这样做。缩小可能的原因,我们发现,file_get_contents php函数在尝试建立ssl连接时失败。

我们正在使用以下脚本测试ssl:

<?php
$url = 'https://satis.work.com/packages.json';
$contextOptions = [
    'ssl' => [
        'verify_peer'      => false,
        'verify_peer_name' => false,
        'local_cert'       => '/home/work/.ssl/deployer.pem',
    ]
];
$sslContext = stream_context_create($contextOptions);
$result = file_get_contents($url, false, $sslContext);
echo $result, "\n"; 

这是抛出的:

PHP警告:file\u get\u contents():无法设置本地证书链文件“%home/work/”。ssl/deployer。pem′;检查您的cafile/capath设置是否在/home/omlook/test ssl中包含证书及其颁发者的详细信息。php第12行php警告:file_get_contents():无法在/home/work/test ssl中启用加密。php第12行php警告:文件获取内容(https://satis.work.com/packages.json):无法打开流:在/home/work/test ssl中操作失败。php在线12

这绝对不是权限或文件所有权的问题,脚本可以读取. pem就好了。令人困惑的是,在我的本地环境中,完全相同的脚本和. pem键是如何正常工作的,而且版本差异似乎没有那么大。

当地环境:

PHP7.0。18-0ubuntu0。16.04.1(cli)(NTS)版权所有(c)1997-2017 PHP Group Zend Engine v3。0.0,版权所有(c)1998-2017 Zend Technologies与Zend OPcache v7。0.18-0 uBuntu0。16.04.Zend Technologies 1999-2017年版权所有(c)

OpenSSL 1.0。2g 2016年3月1日

服务器:

PHP7.1。7-1乌本图14。04.1黛布。苏里。org 1(cli)(创建日期:2017年7月7日10:07:42)(NTS)版权所有(c)1997-2017 PHP Group Zend Engine v3。1.0,版权所有(c)1998-2017 Zend Technologies与Zend OPcache v7。1.7-1乌本图14。04.1黛布。苏里。组织1,版权(c)1999-2017,由Zend Technologies出版

OpenSSL 1.1。2017年5月25日起

共有2个答案

曾新
2023-03-14

我为自己解决了同样的问题。明文元数据似乎无关紧要。类似的代码在openssl 1.1.0j的php 7.0上对我有效,在openssl 1.1.1c的php 7.3上被打破-我有相同的错误文本。添加明文元数据对我没有帮助。用当前ca证书添加Cafile上下文参数对我也没有帮助。

当我试图用curl提出同样的请求时,我有错误:

curl -k --cert cert.pem https://myservice.com/soap/ShopService/
curl: (58) could not load PEM client certificate, OpenSSL error error:140AB18E:SSL routines:SSL_CTX_use_certificate:ca md too weak, (no key found, wrong pass phrase, or wrong file format?)

所以我发现现有的旧客户端证书是用弱SHA1和RSA加密算法签名的。私钥的长度是2048位-没问题(如果您有1024位-现在不安全,您还需要一个新的更长的密钥)

我已经用实际的sha256散列(openssl选项-sha256)重新发布了我的客户端证书。我的CA证书具有相同的弱哈希sha1,但无需更改它,只需更改客户端证书即可。命令:

# here: 
# cert.pem - my old client certificate with private key
# ca.pem - service's current CA certificate for signing client certificates with it's private key
# cert2.pem - my new working client certificate with the same old private key
#
# make new certificate request from current client certificate
openssl x509 -x509toreq -in cert.pem -out cert2.csr -signkey cert.pem -sha256

# make new certificate
openssl x509 -req -in cert2.csr -out cert2.pem -CA ca.pem -sha256 -days 730 -set_serial 0x51ca170d

# append private key
openssl rsa -in cert.pem >> cert2.pem

小时的痛苦,现在它的确定)似乎php发送不正确的错误消息为这个错误。

陆子默
2023-03-14

只有在PEM文件中的“开始证书”部分之前省略了明文元数据(颁发者、有效性等)时,才会出现这种情况。对于较新版本的PHP(包括7.0),这一部分现在似乎是强制性的。到目前为止,我还没有发现更多,但我的猜测是,这是一个openssl问题。更新证书,包括openssl生成的元数据部分,为我解决了这个问题。

 类似资料:
  • PHP/Apache2中的文件获取内容是从Facebook获取用户图片。直到最近,它一直运转良好。现在,它总是在一分钟后超时,在我的Apache2 error.log中有以下错误: PHP警告:文件\u获取\u内容(https://graph.facebook.com/999999999/picture?width=200):无法打开流:连接超时 下面是代码(我最近添加了$context以查看它是

  • 我已经创建了一个索引。MAMP中的php页面。 我的索引。php的读取方式与下面的完全相同。我通过localhost:8888访问它。 然而,它并没有像我相信的那样从这个页面返回html源代码,而是返回http://stackoverflow.com 作为一个常规网页,就像你现在看到的网页一样。 我的MAMP使用PHP 5.5.10。user_agent,allow_url_fopen。 我很困惑

  • 我正在使用php执行一个远程url,使用文件内容。如果file_get_contents检索到的内容不是空的,那么我会回显一条消息,说是complete。 然而,远程网址有时可能需要一点时间来加载,因为这整个PHP页面需要很长时间来加载。当它完成时,显示结果为完成或错误 谢谢

  • 我在使用file\u get\u内容与$\u get组合时遇到问题。例如,我尝试使用文件\u get\u内容加载以下页面: https://bing.com/?q=how 打领带 如果我像这样加载它,页面加载正常: http://localhost/load1.php 然而,当我这样加载它时,我有问题: http://localhost/load2.php?url=https//bing.com/

  • 我正在尝试将安装模块添加到测试Drupal站点,但是我一直收到以下错误:由于错误“cURL error 60:SSL证书问题:无法获取本地颁发者证书(请参阅http://curl.haxx.se/libcurl/c/libcurl-errors.html)"无法从中检索Drupal项目https://www.drupal.org/project/ctools/releases/8.x-3.4. 到