composer diag 不验证镜像源 HTTPS 连通性,仅检测本地环境与官方源基础连通性;真实验证需结合 composer install --dry-run 强制走镜像、curl -vI 查 TLS 握手及证书详情、openssl s_client 定位证书链断裂点,四层串联才可靠。

composer diag 不验证镜像源 HTTPS 连通性
很多人以为 composer diag 能测出镜像是否可用,其实它只检查本地配置、PHP 环境和基础网络(比如能否 ping 通),**完全不走任何仓库 URL**。即使你配了已停用的 https://packagist.phpcomposer.com,composer diag 依然显示 “OK”。真正要验证安全连接是否有效,得让 Composer 实际发起一次包元数据请求。
用最小 composer.json + --dry-run 强制走镜像
伪造一个极简项目,强制 Composer 使用指定镜像拉取 packages.json,这是最贴近真实安装流程的验证方式:
- 新建空目录,写入
composer.json,内容必须包含完整repositories块,且type和结尾/缺一不可:{ "repositories": [ { "type": "composer", "url": "https://mirrors.aliyun.com/composer/" } ], "require": { "php": "^8.0" } } - 运行命令(加
--no-plugins --no-scripts --dry-run避免副作用):COMPOSER_HOME=/tmp/composer-test composer install 2>&1 | grep -q "Writing lock" - 成功表示镜像返回了合法的 Composer 协议响应;失败时看错误关键词:
Could not fetch(连不上)、SSL certificate problem(证书链断裂)、Connection refused(端口被墙或代理错配)
curl -I 检查 HTTP 层但不够,必须加 -v 看 TLS 握手细节
curl -I https://mirrors.aliyun.com/composer/ 只能告诉你状态码和头,但 SSL 错误常藏在握手阶段。真正要看证书是否被信任、是否过期、是否匹配域名,得加 -v:
- 执行:
curl -vI https://mirrors.aliyun.com/composer/ 2>&1 | grep -E "(SSL|subject|issuer|expire)" - 重点确认:
* Server certificate verification failed(本地 CA 问题)、subject: CN=*.aliyun.com(域名匹配)、expire date:(是否在有效期内) - 如果 curl 也报错,说明不是 Composer 配置问题,而是系统级证书或时间偏差——此时改
composer config没用
openssl s_client 能定位证书链断裂点
当 curl -v 显示证书验证失败但看不出哪一级断了,直接用 OpenSSL 工具深挖:
- 执行:
openssl s_client -connect mirrors.aliyun.com:443 -servername mirrors.aliyun.com -showcerts - 输出里找
Verify return code: 0 (ok)—— 不是 0 就说明有问题,常见值:20(无法获取本地颁发机构)、21(证书过期)、62(主机名不匹配) - 注意:该命令不依赖 PHP 的
cafile,它走的是系统默认 CA 路径,所以结果和php -r "print_r(openssl_get_cert_locations());"对比,就能判断是系统证书旧,还是 PHP 配错了路径
真实有效的安全连接验证,从来不是单点检查。它必须串联「Composer 协议层」、「HTTP 响应层」、「TLS 握手层」和「证书链解析层」——漏掉任意一层,都可能让你误判为“镜像挂了”,实际只是本地 openssl.cafile 指向了一个 2019 年的空文件。











