直接换镜像源不安全,因阿里云等镜像不提供 signature 元数据,导致 composer 自动跳过签名验证;安全配置须同时启用 security.signature、正确设置 repos.packagist(复数)代理元数据、开启 secure-http。

为什么直接换镜像源反而不安全
直接执行 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 会完全替换官方源,导致签名验证被跳过——因为阿里云、腾讯云等镜像站不提供 composer-signature 元数据,composer install 时自动 fallback 到无校验模式。攻击者一旦污染镜像缓存,你拉下来的 vendor/ 就是被篡改过的代码。
真正安全的配置必须同时满足三件事
缺一不可,否则签名验证形同虚设:
-
composer config -g security.signature true:全局启用官方签名验证(Composer 2.2+ 支持) -
composer config -g repos.packagist.type composer且composer config -g repos.packagist.url https://mirrors.aliyun.com/composer/:注意是repos.packagist(复数),不是repo.packagist;这是“仅代理元数据”,包文件仍走带校验的官方 CDN -
composer config -g secure-http true:确保不接受 HTTP 源(默认已开启,但显式确认更稳妥)
验证是否真生效,别信 config 输出
composer config -g repos.packagist 只告诉你“写了什么”,不等于 Composer 正在用它。真实行为看日志:
- 运行
composer clear-cache && composer require monolog/monolog -vvv - 搜索日志里的
GET https,确认出现的是https://mirrors.aliyun.com/composer/packages.json - 同时检查
composer diagnose输出中 “signature verification: OK” 和 “secure-http: OK” 是否都为 OK
私有镜像源(如内网 Satis)要额外加 SSL 验证
如果你搭了内部 Composer 仓库,比如 https://packages.internal.company/,不能只写 URL:
- 必须在
repositories中显式声明"options": {"ssl": {"verify_peer": true, "allow_self_signed": false}} - 若用自签名证书,
allow_self_signed可临时设为true,但需同步把 CA 证书加入系统信任链,否则 PHP cURL 层会拒绝连接 - URL 必须以
/结尾,否则请求会拼成/packages.json→ 404
最常被忽略的一点:哪怕镜像 URL 是 HTTPS,只要没启用 security.signature,或者用了 repo.packagist(单数)这种错误键名,整个安全链就断了——你看到的“加速”只是假象。











