Composer Curl 错误 60: SSL 证书问题: 无法获取本地颁发者证书

13

我正试图使composer在使用代理的远程Windows机器上工作,但每当执行composer install/update时,都会遇到以下错误:

[Composer\Downloader\TransportException] curl错误 60,下载https://flex.symfony.com/versions.json时出错:SSL证书问题:无法获取本地颁发者证书

这是我的composer.bat文件:

@echo OFF
:: in case DelayedExpansion is on and a path contains ! 
setlocal DISABLEDELAYEDEXPANSION
set HTTP_PROXY=<proxyurl>
php "%~dp0composer.phar" %*

显然需要设置代理,如果我删除这行代码,错误将变成这样:

[Composer\Downloader\TransportException] 当 https://flex.symfony.com/versions.json 下载时出现 curl 错误 28: 操作超时,已接收到 0 字节的数据

composer diag 命令在设置代理后显示如下:

Checking composer.json: OK
Checking platform settings: OK
Checking git settings: OK
Checking http connectivity to packagist: OK
Checking https connectivity to packagist: OK
Checking HTTP proxy: OK
Checking github.com rate limit: OK
Checking disk free space: OK
Checking pubkeys:
Tags Public Key Fingerprint: 57815BA2 7E54DC31 7ECC7CC5 573090D0  87719BA6 8F3BB723 4E5D42D0 84A14642
Dev Public Key Fingerprint: 4AC45767 E5EC2265 2F0C1167 CBBB8A2B  0C708369 153E328C AD90147D AFE50952
OK
Checking composer version: OK
Composer version: 2.0.9
PHP version: 7.4.7
PHP binary path: C:\Program Files\PHP\current\php.exe
OpenSSL version: OpenSSL 1.1.1g  21 Apr 2020
cURL version: 7.69.1 libz 1.2.11 ssl OpenSSL/1.1.1g
zip: extension present, unzip not available

我看了很多帖子和教程,但没有一个答案对我有用。(一些只是关于curl及其选项切换关检查的,但这对composer无效)下面是我尝试过的:

  • http://curl.haxx.se/ca/cacert.pemhttps://curl.se/docs/caextract.html下载cacert.pem(不要复制粘贴,因为有人说编辑文件会使其损坏——然而这样做应该可以)
  • 将文件保存到本地
  • 在php.ini中激活openssl
  • 编辑php.ini并添加证书文件的路径到“curl.cainfo”和“openssl.cafile”中(根据一些帖子,这可能会有所不同,所以我都试过),像这样使用完整路径和引号:curl.cainfo="C:\Program Files\PHP\cacert.pem"
  • 将pem文件移动到不同的目录中,以确保没有Windows权限会使它无法访问(我还将文件及其目录设置为所有用户都能访问的状态,以确保万无一失)
  • 使用php -r "print_r(openssl_get_cert_locations());"查找默认证书文件位置(它是“C:\Program Files\Common Files\SSL”),也将证书文件保存在那里

所有这些都没有起作用,错误仍然存在。 后来我找到了一篇帖子,在composer.json中设置了一个存储库,并明确为该存储库设置了认证文件,所以我也尝试了并将以下内容添加到我的composer.json中:

{
  "repositories": [{
    "type": "composer",
    "url": "https://flex.symfony.com",
    "options" : {
      "ssl" : {
        "cafile" : "cacert.pem"
      }
    }
  }]
}

文件 "cacert.pem" 与我的 composer.json 在同一个目录下,现在出现的错误是:

[Composer\Downloader\TransportException] 无法下载"https://flex.symfony.com/packages.json"文件 (HTTP/2 404 )

这并不奇怪,因为尝试通过浏览器访问 "https://flex.symfony.com/packages.json" 也会给出 404 错误。(不知道 "versions.json" 的证书错误先加载还是 "packages.json" 先加载是否有影响,也不确定这个错误是否是一个 "好" 迹象。)

这个试错之旅已经持续了几天,我无计可施,所以任何帮助都将不胜感激!

10个回答

32

我不知道你的问题是否与我刚遇到的问题相同,但我通过在 cmd 中执行以下命令解决了它:

composer config -g -- disable-tls false

不管怎样,我正在使用WAMP。


这对我很有效,谢谢@daddi Al Amoudi。 - Tijani
我已经禁用了这个设置来处理PHP 5.6代码,然后完全忘记了它。 - Pierre

15
进一步的研究发现问题出在代理服务器ZScaler上。正如这篇文章所述,ZScaler拦截SSL流量并使用自己的证书重新加密,该证书不受信任,因此Composer(或通过https访问网站的任何其他程序)将报告上述错误,即“无法获取本地签发者证书”。
因此,解决方法必须是在服务器上信任“ZScaler Intermediate Root CA”。(由于公司政策,我无法自行执行此操作,但是任何寻找解决上述问题的人现在可能已经得到了另一个提示。)

6

Linux (本指南中的路径将假定在Ubuntu 18.04 LTS上进行默认的Linux安装,但其他发行版也会类似。)

  1. 从curl.se下载最新的CA捆绑包提取文件。

    wget https://curl.se/ca/cacert.pem -O /etc/ssl/certs/cacert.pem --no-check-certificate

  2. 编辑php.ini文件。

对于Ubuntu 18.04,需要修改以下位置中的2个php.ini文件:

/etc/php//cli/php.ini

/etc/php//fpm/php.ini

将 替换为您正在使用的PHP版本,因此对于PHP 7.4,路径将为/etc/php/7.4/...

在这些文件中,您需要使用新CA捆绑包的路径修改或添加curl.cainfo和openssl.cafile参数:

[curl]

curl.cainfo = /etc/ssl/certs/cacert.pem

[openssl]

openssl.cafile = /etc/ssl/certs/cacert.pem

(如果您的php.ini文件中不存在该参数,则只需添加该参数。重复的参数可能会导致PHP无法正确运行)

  1. 重新启动php-fpm以加载新设置。

systemctl restart php-fpm

将 替换为您正在使用的PHP版本,因此对于PHP 7.4,命令将是systemctl restart php7.4-fpm

完成!

来源:(https://support.deskpro.com/is/kb/articles/how-to-update-curl-trusted-root-certificates


这是唯一对我起作用的解决方案 - 谢谢! - maestroosram

6

我使用 composer config -g secure-http false 命令,并使用 composer clearcache 清除了我的 Composer 缓存,解决了在 WAMP 服务器上的问题。


2
如果您使用的是早于1.17.1版本的symfony/flex:
composer show symfony/flex

那么您需要更新它为:

composer update symfony/flex --no-plugins --no-scripts

Source


1

0

即使这是一个老问题,并且有很多答案,但我发现没有一个适用于我。在我的情况下,我使用Docker进行本地开发环境,因此使用某种操作系统黑客不起作用,因为它不是持久的,而且最重要的是不能传递给我的任何团队成员(是的,我知道我可以拥有自己的镜像,但不值得努力)。这个问题是在使用assets-packagist存储库时引起的。

我使用了这个post来解决这个问题,为此我在我的项目根目录下载了cacert.pem并将其绑定到我的容器,并将存储库设置如下:

"assets": {
   "type": "composer",
   "url": "https://asset-packagist.org",
   "options": {
       "ssl": {
          "verify_peer": true,
          "allow_self_signed": true,
          "cafile": "/var/www/html/cacert.pem"
       }
   }
}

这样任何composer命令都可以正常工作,并且信任注册证书。


0

有时会遇到问题,如果系统没有连接到公司为安全安装的Zscaler。连接Zscaler并重新运行命令,问题将得到解决。


0

在执行 Yii2 项目的 composer install 时,遇到了这个问题:https://asset-packagist.org 无法完全加载(下载 https://asset-packagist.org/packages.json 时出现 curl 错误 60:SSL 证书问题:证书已过期),包信息从本地缓存中加载,可能已过时。

我在 Windows 操作系统和 Wamp 上遇到了这个问题。我使用了这个视频 SSL 证书 来更新证书,但仍然面临同样的问题。最后,我使用命令 composer self-update 来更新 Composer,一切都正常了。我将 Composer 版本从 2.1.8 更新到了 2.2.7


-2

看起来你走错了路

如果你正在使用 PHP 版本 php7.4.21

正确的路径是:Applications/MAMP/bin/php/php7.4.21

错误的路径是:Applications/MAMP/config/php7.4.21


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接