根本原因是PHP底层CA证书失效,需通过php -r "print_r(openssl_get_cert_locations());"确认default_cert_file和ini_cafile路径有效性,再下载curl.se官方cacert.pem并统一配置openssl.cafile与curl.cainfo为同一绝对路径,最后重启CLI终端或Web服务。

不是镜像源过期,是 PHP 底层 CA 证书失效 —— 换镜像或关 SSL 验证只能临时绕开,修不对 php.ini 里的 openssl.cafile 和 curl.cainfo,问题必然复现。
确认是不是本地 CA 证书问题,而不是镜像本身
别一看到 “certificate has expired” 就去搜新镜像地址。先跑这三行命令快速定位根因:
-
php -r "print_r(openssl_get_cert_locations());"—— 看default_cert_file是否为空、路径是否存在、文件最后修改时间是否早于 2022 年;再看ini_cafile是否和它一致 -
curl -v https://packagist.org/packages.json—— 如果也报SSL certificate problem: unable to get local issuer certificate,说明是系统/PHP 层级证书失效,和 Composer 配置无关 -
php --ini—— 确保你编辑的是 CLI 模式下真正生效的php.ini(尤其多版本 PHP 或 Docker 环境里常有多个)
下载并统一配置最新 cacert.pem
必须用 curl.se 官方维护的证书包,XAMPP/WAMP/phpEnv 自带的 curl-ca-bundle.crt 多数停更于 2021 年,无法验证 ISRG Root X1 证书。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Linux/macOS:
curl -sS https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 -o /usr/local/etc/php/cacert.pem - Windows:
curl -sS https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 -o C:/phpEnv/php/extras/ssl/cacert.pem - 在
php.ini中同时写两行,路径必须完全一致、绝对路径、英文双引号包裹:openssl.cafile="/usr/local/etc/php/cacert.pem"curl.cainfo="/usr/local/etc/php/cacert.pem" - Windows 路径中单反斜杠是转义符,必须写成
C:/phpEnv/php/extras/ssl/cacert.pem或C:\phpEnv\php\extras\ssl\cacert.pem
验证镜像源是否真的可用,而非证书问题
有些报错看着像证书过期,实则是镜像本身不可用或 DNS 解析异常:
- 运行
curl -I https://mirrors.aliyun.com/composer/,若返回HTTP/2 200且无证书警告,说明镜像端正常,问题一定在本地证书或 PHP 配置 - 检查当前全局镜像配置:
composer config -g repo.packagist,输出应为https://mirrors.aliyun.com/composer/(注意是 HTTPS,阿里云已停用 HTTP) - 若输出为空或仍是
https://packagist.org,说明没切镜像,先执行:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer config -g cafile 为什么总不起作用
这条命令只影响 Composer 自封装的 HTTP 客户端(如 php-http 驱动),而实际发起 HTTPS 请求的是 PHP 的 cURL 或 OpenSSL 扩展:
- 它无法覆盖
curl.cainfo的优先级,也不能修复底层 TLS 握手失败 - 你执行
composer config -g cafile /path/to/cacert.pem后,composer diagnose可能显示 “CA file configured”,但composer install依然报错,就是典型表现 - 真正起效的只有
php.ini中的openssl.cafile和curl.cainfo,且改完后 CLI 模式需关闭终端重开,Web 模式必须重启整个服务(仅重载配置无效)
最易被忽略的是:CLI 和 Web 环境可能加载不同的 php.ini,php --ini 和 phpinfo() 输出的路径往往不一致;改完后不重启、不换终端,等于没改。

















