根本原因是PHP底层OpenSSL信任库缺失或陈旧,需在php.ini中同时配置curl.cainfo和openssl.cafile指向同一最新cacert.pem文件并重启环境,而非更换镜像或禁用SSL验证。

根本不是镜像源“过期”,而是 PHP 底层 OpenSSL 信任库缺失或陈旧,导致无法验证 HTTPS 镜像站的证书链。修复必须落在 php.ini 的证书路径配置上,而非换源或关验证。
确认是不是 CA 证书问题,而不是网络或镜像本身
别急着改 composer.json 或切镜像,先跑这三行命令快速定位:
-
php -r "print_r(openssl_get_cert_locations());"—— 看default_cert_file和ini_cafile是否为空、路径是否存在、文件是否为空或太旧(比如最后更新在 2022 年前) -
curl -v https://packagist.org/packages.json—— 如果也报SSL certificate problem: unable to get local issuer certificate,说明是系统/PHP 层级证书失效,和 Composer 配置无关 -
php --ini—— 确保你编辑的是 CLI 模式下真正生效的php.ini(尤其 phpEnv、Docker 或多版本 PHP 环境里常有多个 ini 文件)
Windows 下 php.ini 配置 curl.cainfo 和 openssl.cafile 的坑
Windows 环境(XAMPP/WAMP/phpEnv)最容易因路径写法翻车:
- 路径必须用正斜杠
/或双反斜杠\,单反斜杠会被 PHP 当作转义符(例如C:phpextrassslcacert.pem实际解析失败) - 别用 PHP 自带的
curl-ca-bundle.crt—— 它基本停更于 2021 年,无法验证 ISRG Root X1 证书 - 必须同时设置两行,且路径完全一致:
curl.cainfo="C:/phpEnv/php/extras/ssl/cacert.pem"openssl.cafile="C:/phpEnv/php/extras/ssl/cacert.pem" - 改完必须关闭并重开终端 —— phpEnv 的 CLI PHP 不热加载 ini
Linux/macOS 更新系统级 CA 证书包更彻底
系统级证书更新比单独配 php.ini 更可靠,尤其对 Docker、CI 环境:
- 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/*(适用于 Debian/Ubuntu 基础镜像) - 验证:
openssl version -d查看 OpenSSL 配置目录,再确认该目录下的cert.pem是否包含ISRG Root X1
为什么 composer config -g cafile 或 secure-http=false 大概率无效
这些命令治标不治本,还可能引入新问题:
-
composer config -g cafile只影响 Composer 自封装的 HTTP 客户端(php-http),而 SSL 验证失败实际发生在 PHP 的cURL或OpenSSL扩展层,它们根本不读 Composer 配置 -
composer config -g secure-http false在 Packagist 自 2022 年强制 HTTPS 后已失效,设了反而让composer install直接退出 -
--no-secure-http或COMPOSER_NO_SSL=true仅限调试,CI 中使用等于放弃 TLS 安全保障,且无法解决底层 cURL 握手失败
真正起效的只有 php.ini 中的 openssl.cafile 和 curl.cainfo,且二者必须指向同一份最新 cacert.pem。证书文件务必从 curl.se 官方源 下载,别用任何第三方打包或旧版 XAMPP 附带的证书包——这是最常被忽略、但决定成败的一环。


















