1

我们正在使用 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 设置是否在第 12 行的 /home/omlook/test-ssl.php 中包含证书及其颁发者的详细信息 PHP 警告:file_get_contents():无法在 /home/work/test-ssl 中启用加密。第 12 行 PHP 警告:file_get_contents(https://satis.work.com/packages.json):打开流失败:第 12 行 /home/work/test-ssl.php 中的操作失败

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

当地环境:

PHP 7.0.18-0ubuntu0.16.04.1 (cli) ( NTS ) 版权所有 (c) 1997-2017 PHP Group Zend Engine v3.0.0,版权所有 (c) 1998-2017 Zend Technologies with Zend OPcache v7.0.18-0ubuntu0。 16.04.1,版权所有 (c) 1999-2017,由 Zend Technologies 提供

OpenSSL 1.0.2g 2016 年 3 月 1 日

服务器:

PHP 7.1.7-1+ubuntu14.04.1+deb.sury.org+1 (cli) (build: Jul 7 2017 10:07:42) (NTS) Copyright (c) 1997-2017 The PHP Group Zend Engine v3. 1.0,版权所有 (c) 1998-2017 Zend Technologies with 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 日

4

2 回答 2

0

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

于 2017-08-17T08:52:10.400 回答
0

我为我解决了同样的问题。明文元数据似乎无关紧要。类似的代码在带有 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?)

所以我发现现有的旧客户端证书是用弱 sha1WithRsaEncryption 算法签名的。 私钥是 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为此错误发送了不正确的错误消息。

于 2019-11-26T09:26:28.943 回答