Composer install报SSL证书过期错误,本质是本地系统时间偏差超2分钟、PHP的openssl.cafile与curl.cainfo未同步配置CA证书路径、或镜像源配置缺失type及结尾/导致回退官方源;需依次校准时间、更新CA证书、正确配置镜像源。

composer install报SSL certificate problem: certificate has expired
这不是镜像站证书真过期了,而是你本地系统时间比真实时间快或慢太多(常见偏差超2分钟),导致OpenSSL校验HTTPS证书的notBefore/notAfter字段失败。Composer本身不报“时间不准”,只甩出“certificate has expired”这种误导性错误。
- 先验证时间偏差:运行
date(Linux/macOS)或time(Windows),对比网络标准时间(如 time.gov) - Linux/macOS:用
timedatectl status确认NTP是否启用;若未同步,执行sudo timedatectl set-ntp true再sudo systemctl restart systemd-timesyncd - Windows:以管理员身份运行
w32tm /resync;若失败,先执行w32tm /config /syncfromflags:manual /manualpeerlist:"time.windows.com pool.ntp.org"再重试 - 容器环境(Docker):不能依赖宿主机NTP,需在
Dockerfile中显式调用apk add --no-cache ntpclient && ntpclient -s -h pool.ntp.org或挂载/etc/timezone
php.ini里openssl.cafile和curl.cainfo必须同时配且路径一致
PHP的OpenSSL扩展走openssl.cafile,cURL扩展(Composer底层依赖)走curl.cainfo——漏配任一,或两个路径指向不同文件,都会触发SSL校验失败,且错误表现高度相似。
- 先查PHP实际读哪个路径:
php -r "print_r(openssl_get_cert_locations());",重点关注ini_cafile(php.ini生效值)和default_cert_file(fallback路径) - 下载最新CA包:
curl -sS https://curl.se/ca/cacert.pem -o /path/to/cacert.pem(Linux/macOS建议存到/usr/local/etc/openssl/cert.pem,Windows用正斜杠如C:/php/extras/ssl/cacert.pem) - 编辑php.ini,**两行都写**:
openssl.cafile = "/path/to/cacert.pem"curl.cainfo = "/path/to/cacert.pem" - 改完必须重启:CLI模式新开终端;Apache执行
sudo apachectl restart;PHP-FPM执行sudo systemctl restart php-fpm
composer config配置镜像源时type和结尾/缺一不可
Composer要求镜像源配置必须显式声明type且URL以/结尾,否则它会静默回退到官方源packagist.org,然后卡在该站的证书验证上——你以为连的是阿里云,实际连的是已受审查或证书异常的官方站。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 错的写法:
composer config -g repo.packagist https://mirrors.aliyun.com/composer(缺type、缺结尾/) - 对的写法:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 验证是否生效:
composer config -g repo.packagist,输出必须是完整JSON:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} - 项目级更稳妥:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(自动写入composer.json的repositories字段)
旧镜像源停服导致签名验证失败
Composer 2.2+默认校验packages.json的GPG签名,而部分已下线镜像(如https://packagist.phpcomposer.com)返回空响应或伪造数据,直接触发Signature verification failed——这和证书无关,但错误信息容易误判。
- 检查当前镜像:
composer config -g repo.packagist,若输出含phpcomposer.com、packagist.laravel-china.org等域名,立刻停用 - 直连测试:
curl -I https://packagist.org/packages.json 2>/dev/null | head -1,返回HTTP/2 200说明网络和证书链正常;若失败,才是证书或时间问题 - 优先使用已知稳定镜像:
https://mirrors.aliyun.com/composer/、https://packagist.jp/(日本)、https://packagist.com/(商业版,需订阅)
真正卡住的点往往不是单个配置,而是时间、证书、镜像三者叠加失效——比如系统时间快了5分钟,cafile指向一个2021年的证书文件,又配了个已停服的镜像源,此时任何单一修复都不起作用。先跑php -r "print_r(openssl_get_cert_locations());"和date,把这两条命令的输出对照着看,比盲目改配置高效得多。

















