我们使用 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_get_contents():无法设置本地证书链文件“/home/work/.ssl/deployer.pem”;检查您的 cafile/capath 设置是否包含您的证书及其颁发者的详细信息,位于 /home/omlook/test-ssl.php 第 12 行
PHP 警告:file_get_contents():无法在第 12 行 /home/work/test-ssl.php 中启用加密
PHP 警告:file_get_contents(https://satis.work.com/packages.json https://satis.work.com/packages.json): 无法打开流:第 12 行 /home/work/test-ssl.php 中的操作失败
这绝对不是权限或文件所有权的问题,脚本可以很好地读取 .pem。令人困惑的是,这是如何exact相同的脚本和 .pem 密钥在我的本地环境中工作得很好,并且版本差异似乎并不那么显着。
当地环境:
PHP 7.0.18-0ubuntu0.16.04.1(cli)(NTS)
版权所有 (c) 1997-2017 PHP 集团
Zend Engine v3.0.0,版权所有 (c) 1998-2017 Zend Technologies
使用 Zend OPcache v7.0.18-0ubuntu0.16.04.1,版权所有 (c) 1999-2017,作者:Zend Technologies
OpenSSL 1.0.2g 2016 年 3 月 1 日
Server:
PHP 7.1.7-1+ubuntu14.04.1+deb.sury.org+1 (cli)(构建时间:2017 年 7 月 7 日 10:07:42)( NTS )
版权所有 (c) 1997-2017 PHP 集团
Zend Engine v3.1.0,版权所有 (c) 1998-2017 Zend Technologies
使用 Zend OPcache v7.1.7-1+ubuntu14.04.1+deb.sury.org+1,版权所有 (c) 1999-2017,Zend Technologies
OpenSSL 1.1.0f 2017 年 5 月 25 日
仅当您在 PEM 文件中的“BEGIN CERTIFICATE”部分之前省略明文元数据(颁发者、有效性等)时,才会发生这种情况。对于较新版本的 PHP(包括 7.0),这部分现在似乎是强制性的。到目前为止我还没有找到更多信息,但我的猜测是,这是一个 openssl 问题。
更新证书,包括 openssl 生成的元数据部分,解决了我的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)