答案是运行php -r "print_r(openssl_get_cert_locations());"确认default_cert_file和ini_cafile路径,检查文件是否存在、非空、未过期(应晚于2024年),再用curl -i https://packagist.org验证系统级https连通性,最后下载https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251覆盖对应证书文件并重启php服务。

Composer install 因根证书链缺失中断,不是网络问题,而是 PHP 的 OpenSSL 找不到可信 CA 证书——它不会报“证书错误”这种明确提示,常卡在 Loading composer repositories 或直接抛 SSL operation failed with code 1。
怎么确认真是 CA 证书链缺失?
别猜,直接验证:
- 运行
php -r "print_r(openssl_get_cert_locations());",看输出里default_cert_file和ini_cafile指向哪个路径(比如/etc/ssl/certs/ca-certificates.crt或/etc/pki/tls/cert.pem) - 用
curl -I https://packagist.org测试系统级 HTTPS 是否通;如果也失败,说明是底层 CA 问题,不是 Composer 单独能绕过的 - 检查该证书文件是否存在、是否为空、最后修改时间是否早于 2024 年——过期的
ca-bundle.crt是常见元凶
替换 CA 证书文件的实操步骤
下载权威最新证书包,替换 PHP 实际加载的那个文件:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 从 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载最新
cacert.pem - 备份原证书:
sudo cp /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt.bak(路径以openssl_get_cert_locations()输出为准) - 覆盖写入:
sudo curl -o /etc/ssl/certs/ca-certificates.crt https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 - 若 PHP 配置了独立
openssl.cafile(查php --ini对应 php.ini),需同步更新该配置项指向新文件
群晖 NAS 用户特别注意证书路径错配
群晖 WebStation 绑定的 PHP(如 /volume1/@appstore/PHP82/usr/bin/php)通常不读系统 CA 路径,而是硬编码或依赖自身证书库:
- 先确认实际 PHP 路径:
/volume1/@appstore/PHP82/usr/bin/php -r "print_r(openssl_get_cert_locations());" - 常见真实路径是
/volume1/@appstore/PHP82/usr/share/curl/curl-ca-bundle.crt或/usr/syno/share/ca-certificates/cacert.pem - 用同一 PHP 路径执行下载:
/volume1/@appstore/PHP82/usr/bin/php -r "file_put_contents('/volume1/@appstore/PHP82/usr/share/curl/curl-ca-bundle.crt', file_get_contents('https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251'));" - 改完必须重启对应 PHP 版本(DSM → WebStation → PHP 设置 → 点「重启该 PHP 版本」),否则不生效
别碰 --no-secure-http,它不解决证书校验失败
--no-secure-http 只控制是否允许 HTTP 协议仓库,和 SSL 证书验证完全无关。真正触发 certificate verify failed 的是 PHP 的 stream_context_create() 或 cURL,不是 Composer 自己的逻辑:
-
composer config -g secure-http false对这类错误无效 -
COMPOSER_NO_SSL=1是旧版变量,Composer 2.x 已弃用 - 临时绕过证书校验要改 PHP 层:在 php.ini 加
openssl.cafile=/path/to/cacert.pem,或命令行传php -d openssl.cafile=/path/to/cacert.pem composer install
CA 证书问题最隐蔽的点在于:它可能只影响特定 PHP 实例(如群晖 WebStation 绑定的 PHP)、只在某些命令下暴露(composer install 会拉 packages.json,composer diagnose 却可能不触发)、甚至因系统时间偏差让有效证书被判定为过期——修证书前,先用 date 看一眼系统时间准不准。










