答案是系统时间偏差超2分钟导致SSL证书校验失败,需先校准时间再更新CA证书路径并确认镜像源有效。OpenSSL严格比对证书notBefore/notAfter与系统时间,偏差3分钟即拒连;php -r "print_r(openssl_get_cert_locations());"查证书路径,curl -I测试可快速定位时钟问题。

系统时间偏差导致SSL证书校验失败
Composer 报 SSL certificate problem: certificate has expired,90% 不是证书真过期,而是本地系统时间快了或慢了超过 2 分钟。OpenSSL 校验证书时严格比对 notBefore 和 notAfter 时间戳,偏差哪怕 3 分钟就直接拒连。
验证方法:运行 curl -I https://packagist.org/packages.json,如果也报同样错误,基本锁定为时钟问题。
- Linux/macOS:执行
timedatectl status查看System clock synchronized是否为yes;若否,运行sudo timedatectl set-ntp true后sudo systemctl restart systemd-timesyncd - Windows:以管理员身份运行
w32tm /resync;若失败,先配置可靠 NTP 源:w32tm /config /syncfromflags:manual /manualpeerlist:"time.windows.com pool.ntp.org",再重试 - 容器/Docker 环境:宿主机时间不准会直接带偏容器,必须先修宿主机;Alpine 镜像需额外安装
openntpd或挂载 host 的/etc/timezone
PHP 的 CA 证书路径配置错误或过期
即使时间准、网络通,openssl.cafile 和 curl.cainfo 指向的证书文件若停更于 2021 年前(比如含已吊销的 DST Root CA X3),就无法验证 ISRG Root X1 等新根证书——结果就是 unable to get local issuer certificate。
别猜路径,先确认 PHP 实际加载位置:php -r "print_r(openssl_get_cert_locations());",重点看 ini_cafile 和 default_cert_file 是否为空、路径是否存在、文件最后修改时间是否 ≥ 2022 年。
- 下载最新证书:用
curl -sS https://curl.se/ca/cacert.pem -o /path/to/cacert.pem(不要浏览器另存,避免 HTML 包裹) - Windows php.ini 示例:
openssl.cafile="C:/php/extras/ssl/cacert.pem"和curl.cainfo="C:/php/extras/ssl/cacert.pem"(路径必须用英文双引号,反斜杠需转义或改正斜杠) - Linux/macOS 常见路径:
/etc/ssl/certs/ca-certificates.crt或/usr/local/etc/php/cacert.pem,替换前先备份原文件 - 改完必须重启:CLI 模式需新开终端;Apache 要
sudo apachectl restart,不是 reload;PHP-FPM 需sudo systemctl restart php-fpm
镜像源本身不支持 GPG 签名或已下线
Composer 2.2+ 默认校验 packages.json 的 GPG 签名,旧镜像如 https://packagist.phpcomposer.com 已停服,返回空或伪造数据,触发 Signature verification failed —— 这和证书无关,但错误现象高度相似。
验证方式:运行 composer config -g repo.packagist,输出必须是完整 JSON 对象,形如 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};若仍是官方地址或空值,说明配置未生效。
- 正确设置命令:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(末尾必须带/) - 项目级优先:只要
composer.json中有"repositories"字段,全局配置就完全失效;推荐进项目目录执行composer config repo.packagist composer https://mirrors.aliyun.com/composer/ - 阿里云、华为云、腾讯云镜像均支持签名,但旧地址如
https://packagist.laravel-china.org已不可用,切勿复用
临时绕过 SSL 校验仅限调试,不能解决问题
--no-secure-http 或 config -g secure-http false 只禁用 HTTPS 强制要求,并不跳过证书链校验;真正绕过 OpenSSL 验证需改 PHP 层配置或设环境变量,风险极高。
临时应急可用:COMPOSER_NO_SSL=1 composer install,但该变量只影响部分版本,且一旦启用,所有 HTTPS 请求都不校验证书——中间人攻击可轻易劫持包内容。
- 生产环境、CI/CD、团队协作中严禁使用
- 若必须调试,仅限离线内网环境,且执行后立刻恢复
- 它掩盖真实问题:时间不准、证书路径错、镜像失效——这些不修,换任何命令都还会崩


















