根本原因是本地php的openssl信任库过期或路径配置失效,需运行php -r "print_r(openssl_get_cert_locations());"确认default_cert_file和ini_cafile路径是否有效且一致,并在php.ini中同步配置curl.cainfo与openssl.cafile指向同一最新cacert.pem文件后重启环境。

直接原因是本地 PHP 的 OpenSSL 信任库过期或路径配置失效,导致无法验证阿里云、腾讯云等中文镜像站的 HTTPS 证书链,不是镜像本身“过期”,更不该关 secure-http。
确认是不是 PHP 的 CA 证书路径问题
别猜,让 PHP 自己告诉你它在用哪个证书文件:
- 运行
php -r "print_r(openssl_get_cert_locations());",重点看default_cert_file和ini_cafile两项 - 如果
default_cert_file为空、指向不存在的路径(比如C:\php\extras\ssl\curl-ca-bundle.crt但该文件根本没下载),或文件大小为 0,就是根因 - 如果
ini_cafile和default_cert_file不一致,说明你改的php.ini没生效,或者加载了错误的配置文件 - 再补一刀验证:
curl -v https://packagist.org/packages.json,如果同样报SSL certificate problem: unable to get local issuer certificate,说明是整个 PHP/cURL 层级的信任链断了
Windows 下配对 curl.cainfo 和 openssl.cafile
XAMPP/WAMP/PHPEnv 环境最容易在这里翻车,必须同时设、路径完全一致、且为绝对路径:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 从 curl.se 官方 下载最新
cacert.pem,保存到稳定路径,例如C:/php/extras/ssl/cacert.pem - 编辑 CLI 模式下真正生效的
php.ini(先跑php --ini确认路径) - 添加两行,路径用正斜杠或双反斜杠,且加英文双引号:
curl.cainfo="C:/php/extras/ssl/cacert.pem"openssl.cafile="C:/php/extras/ssl/cacert.pem" - 改完必须关闭当前终端、新开一个——PHP CLI 不热加载 ini 文件
Linux/macOS 更新系统级 CA 证书包更可靠
尤其对 Docker、CI 或 Homebrew PHP 环境,系统级更新比单独配 php.ini 更彻底:
- Debian/Ubuntu:
sudo apt update && sudo apt install --reinstall ca-certificates && sudo update-ca-certificates - macOS + Homebrew:
brew update && brew upgrade openssl@3 && brew reinstall ca-certificates,再检查php -r "print_r(openssl_get_cert_locations());"中capath是否指向 Homebrew 的证书目录 - Docker 构建时,在
Dockerfile中加:RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/* - 验证:
openssl version -d查 OpenSSL 配置目录,再确认该目录下的cert.pem是否包含 ISRG Root X1(2026 年仍在有效期内)
别碰 composer config -g cafile 或 --disable-tls
这些命令治标不治本,还容易掩盖真实问题:
-
composer config -g cafile只影响 Composer 自封装的 HTTP 客户端(基于 php-http),而实际发起 HTTPS 请求的是 PHP 的 cURL 或 OpenSSL 扩展,它无法覆盖curl.cainfo的优先级 -
composer install --disable-tls是单次调试用的临时方案,启用后所有包走 HTTP 明文,存在中间人劫持风险,CI 环境里误提交会导致安全审计失败 -
composer config -g secure-http false更危险——它会让所有源(包括 packagist.org)降级为 HTTP,不只是跳过证书校验
最常被忽略的是:CLI 和 Web 环境可能用两套 php.ini。改完后务必确认 php --ini 输出的 “Loaded Configuration File” 路径,且重启对应环境(CLI 关终端、Apache/Nginx 重启服务),否则改了等于没改。










