Signature verification failed是签名验证失败,根本原因是证书不可信、系统时间偏差超15分钟或镜像返回空/伪造响应,需依次验证PHP证书路径、直连官方源状态及镜像URL有效性,三者缺一不可。

Signature verification failed 是证书链或镜像源问题,不是网络慢
这个错误根本不是“下载不全”或“网速差”,而是 Composer 在校验 packages.json 签名时失败——Packagist 自 2022 年起强制启用私钥签名,只要证书不可信、系统时间偏差超 15 分钟,或镜像返回伪造/空响应,就直接中断,不警告也不降级。
- 先确认是否是证书问题:运行
php -r "print_r(openssl_get_cert_locations());",检查default_cert_file指向的文件是否存在、可读,且里面包含签发时间 ≥ 2022 年的根证书(如 ISRG Root X1) - 再确认是否是镜像问题:执行
curl -I https://packagist.org/packages.json 2>/dev/null | head -1,返回HTTP/2 200才说明 HTTPS 通;若报SSL certificate problem,就是证书链断了,换镜像没用 - 别用已下线镜像:
composer config -g repo.packagist输出含https://packagist.phpcomposer.com或https://packagist.laravel-china.org的,立刻停用——这些域名已失效,返回空内容导致签名为空
hash verification failed 多半是缓存损坏或镜像同步异常
这个错误表示下载的 ZIP 包内容和 composer.lock 里记录的 SHA256 不一致。它不等于“包被篡改”,绝大多数情况是中间环节出错。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 优先清缓存:
composer clear-cache,然后重试composer install - 临时切回官方源验证:
composer config -g repo.packagist composer https://packagist.org,再运行安装;如果成功,说明当前镜像同步滞后或传输出错 - 不要手动改
composer.lock的 hash 值——它由 Packagist 签名生成,硬改会导致后续所有校验失败 - 某些代理或企业防火墙会重写响应体(比如注入 JS 脚本),也会触发 hash 不匹配;可关掉代理或换热点测试
repo.packagist 配置写对了才生效,漏一个斜杠都白配
Composer 2.x 对镜像配置极其严格:键名、type、URL 格式三者必须同时正确,否则静默忽略,退回到官方源——它不会报错,但你完全感知不到。
- 合法键名只有
repo.packagist,写成repos.packagist或repositories.packagist全无效 - 必须显式指定
type值:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/——注意中间的composer是 type 参数,不能省 - URL 必须以
/结尾:https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(拼路径时变成/composerpackages.json,404) - 项目级配置比全局更可靠:进项目根目录执行
composer config repo.packagist composer https://mirrors.aliyun.com/composer/,它会自动写入composer.json的repositories字段,不受用户权限或 CI 容器影响
PHP 和 OpenSSL 异常也会干扰校验逻辑
极少数情况下,PHP 自身的哈希或 SSL 扩展异常,会让校验函数返回错误结果,看起来像签名失败。
- 验证 PHP 基础能力:
php -r "echo hash('sha256', 'test') . PHP_EOL;"应输出一串 64 位十六进制字符串 - 检查 OpenSSL 是否正常:
php -r "var_dump(openssl_encrypt('a','AES-128-CBC','1234567890123456',false,'1234567890123456'));",不应报错 - 确认
openssl.cafile和curl.cainfo在php.ini中指向同一份最新 CA 文件(推荐从https://curl.se/ca/cacert.pem下载) - PHP 8.5.5 已修复多个底层校验逻辑缺陷,若仍在用 8.3.x 或更早版本,升级 PHP 可能直接解决问题

















