我试图让 composer 在使用代理的远程 Windows 机器上工作,但在执行 composer 安装/更新时我总是会收到此错误:
[Composer\Downloader\TransportException] 下载 https://flex.symfony.com/versions.json 时出现 curl 错误 60: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 时出现卷曲错误 28:操作在 10000 毫秒后超时,收到 0 个字节中的 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
我看过很多帖子和教程,但没有一个答案对我有用。 (有些只是关于卷曲,它是关闭证书检查的选项,但这对作曲家不起作用)。这是我尝试过的:
- 从 http://curl.haxx.se/ca/cacert.pem 或 https://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 中设置了一个存储库,并明确地为该 repo 设置了证书文件,所以我也尝试了一下并将其添加到我的 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。(不知道它是否突然有所不同“ packages.json”无法加载,而 cert-error 抱怨“versions.json”,不知道哪个先加载,如果这个错误是一个“好”的迹象。)
这个反复试验的旅程已经持续了好几天,我没有想法,所以感谢任何帮助!
原文由 Select0r 发布,翻译遵循 CC BY-SA 4.0 许可协议
进一步的研究使我找到了代理,即 ZScaler,这是问题所在。如 这篇 文章所述,ZScaler 拦截 SSL 流量并使用其自己的不受信任的证书对其进行重新加密,因此 Composer(或任何其他通过 https 访问站点的程序)将抱怨上述错误“无法获得本地发行者”证书”。
因此,解决方案必须是让“ZScaler Intermediate Root CA”在服务器上得到信任。 (由于公司政策,我不能自己做,但任何正在寻找上述问题解决方案的人现在可能都有另一个提示。)