“public key not available”本质是签名验证失败,根本原因有三:系统时间偏差超±15分钟、ca证书含吊销根证书(如dst root ca x3)、镜像源停服返回空/伪造数据;须按顺序排查证书、时间、镜像,优先更新ca证书并验证curl直连packagist是否返回http/2 200。

公钥不可用不是 Composer 错误,是签名验证失败
Composer 报 “Public key not available” 或 “Signature verification failed”,根本不是缺公钥文件,而是它尝试用 Packagist 官方公钥验证 packages.json 时失败了。这个验证在 Composer 2.2+ 默认强制开启,一旦失败就中断安装,不给任何中间提示。
常见触发点有三个:系统时间偏差超过 ±15 分钟、PHP 加载的 CA 证书含已吊销根证书(如 DST Root CA X3)、镜像源返回空响应或伪造元数据(如停服的 https://packagist.phpcomposer.com)。
- 先运行
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 错误,说明底层 HTTPS 不通,换镜像没用 - 最后查当前镜像:
composer config -g repo.packagist,输出必须是完整 JSON 对象,例如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};如果还是https://packagist.phpcomposer.com这类旧地址,立刻停用
临时关闭签名验证只用于调试,不能解决根本问题
签名验证关掉后,Composer 就不再校验 packages.json 是否由 Packagist 私钥签发——但这也意味着你无法识别镜像是否被篡改或返回伪造数据。所以它只适合本地快速验证是不是证书/时间问题。
关闭方式只有一种有效:设置环境变量 COMPOSER_NO_SIGNATURE=1,然后运行命令:
COMPOSER_NO_SIGNATURE=1 composer install
注意:--no-secure-http 或 composer config -g secure-http false 不影响签名验证,它们只控制是否强制 HTTPS 协议,和公钥校验无关。
- Linux/macOS:直接前缀运行,作用域仅本次命令
- Windows CMD:先执行
set COMPOSER_NO_SIGNATURE=1,再运行composer install - Windows PowerShell:用
$env:COMPOSER_NO_SIGNATURE="1",再运行命令
项目级配置比全局更可靠,尤其在 Docker/CI 中
很多人配了全局镜像却没生效,是因为项目根目录 composer.json 里有 "repositories" 字段——哪怕只是空数组 "repositories": [],Composer 就会完全忽略全局配置,而不是“优先级低”。这在宝塔、GitHub Actions、Docker 构建中特别常见。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
推荐做法是进项目根目录,执行:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/
这条命令会把配置写进 composer.json 的 repositories 字段下,key 固定为 "packagist"。如果原文件是 "repositories": [],需先手动改成 "repositories": {} 再执行,否则报错。
- 执行后检查
composer.json是否新增了类似这段: "repositories": {"packagist": {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}}- 别忘了同步删掉
composer.lock和vendor/,再重试composer install
CA 证书更新是绕不开的第一步
所有签名验证失败的排查,都必须从 CA 证书开始。PHP 的 openssl.cafile 和 curl.cainfo 必须指向同一份最新 cacert.pem 文件,否则即使换了阿里云镜像,也会卡在 TLS 握手阶段。
下载地址固定为:https://curl.se/ca/cacert.pem(不是浏览器另存为 HTML,要保存为纯文本)。
- Linux/macOS:通常替换系统默认路径,例如
sudo cp cacert.pem /etc/ssl/certs/ca-certificates.crt - Windows:在
php.ini中添加两行(路径用正斜杠):openssl.cafile="/path/to/cacert.pem"<br>curl.cainfo="/path/to/cacert.pem"
- 改完后必须重启 PHP 环境:CLI 模式需新开终端;Web 服务(Apache/Nginx)必须完整重启,
reload不生效
证书路径不对,后面所有配置都是白忙——这点最容易被跳过,但恰恰是 80% 公钥不可用问题的真正起点。










