答案是系统时间偏差超15分钟、本地ca证书过期或镜像源停服所致;composer 2.2+默认校验packagist元数据gpg签名,三者任一未修复则清缓存、换命令均无效。

签名验证失败不是镜像地址错了,而是 Composer 2.2+ 默认启用 GPG 元数据校验后,本地环境无法验证镜像返回的 packages.json 签名——根本原因通常是系统时间不准、CA 证书过期或用了不支持签名的旧镜像源。
为什么 composer install 报 “Signature verification failed”
Composer 不再只校验 ZIP 包的 SHA256,还会检查 packages.json 是否由 Packagist 官方私钥签发。一旦失败就中断,不警告。常见触发点:
-
Signature verification failed或Invalid signature错误直接出现 - 系统时间偏差超过 15 分钟(Packagist 时间戳校验严格)
-
php -r "print_r(openssl_get_cert_locations());"返回的default_cert_file指向含已吊销根证书(如 DST Root CA X3)的过期文件 - 镜像源仍是
https://packagist.phpcomposer.com这类已下线地址,返回空响应或伪造元数据
验证是证书问题还是镜像问题
别猜,用两条命令交叉确认:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 查 PHP 实际加载的证书路径:
php -r "print_r(openssl_get_cert_locations());",确认default_cert_file存在、可读,且文件里最新证书签发时间 ≥ 2022 年 - 直连官方源测试:
curl -I https://packagist.org/packages.json 2>/dev/null | head -1,返回HTTP/2 200才说明网络和证书链正常;若报SSL certificate problem,就是证书路径或内容有问题 - 再查当前镜像:
composer config -g repo.packagist,输出如果是{"type": "composer", "url": "https://packagist.phpcomposer.com"}这类旧域名,立刻停用
必须按顺序修复:先证书,再镜像
顺序不能错——新镜像也连不上,如果底层 HTTPS 不通:
- 下载最新
cacert.pem(来自 PHP 官方推荐链接),保存为纯文本(别用浏览器另存为 HTML) - Windows:在
php.ini中添加两行(路径用正斜杠):openssl.cafile="/path/to/cacert.pem"<br>curl.cainfo="/path/to/cacert.pem"
- Linux/macOS:通常路径为
/etc/ssl/certs/ca-certificates.crt,可用sudo cp cacert.pem /etc/ssl/certs/ca-certificates.crt替换 - 重启环境:
php -v确认生效;CLI 模式需新开终端;Apache/Nginx 必须完整重启服务,reload不行 - 证书确认 OK 后,再执行:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
签名验证相关的关键配置项
只换镜像不够,还得确保签名机制被正确启用:
-
composer config -g security.signature true—— 显式开启元数据签名验证(Composer 2.2+ 默认开启,但某些镜像配置会覆盖它) -
composer config -g secure-http true—— 强制 HTTPS(默认开启,禁用会导致 HTTP 镜像被接受,签名验证失效) - 阿里云、腾讯云等主流镜像只代理元数据,不提供
signature字段,所以不能简单替换为repos.packagist.url;必须用repo.packagist键名 +composertype,让 Composer 知道这是“元数据镜像”,而非完整源替代
真正麻烦的是私有仓库或 fork 项目干扰:一旦 composer.json 里写了自定义 repositories,尤其是 type: vcs,它的 dist 包 URL 和 checksum 就可能和 packagist.org 不一致——这种情况下,连官方源也会报错,得先 composer config --unset reposi 临时清掉自定义源再试。










