私有仓库真正安全必须https+自定义ca:ssl.cafile需指向完整pem链(中间ca在前、根ca在后),必须全局配置且php进程有读权限,同时禁用packagist.org并确保auth.json域名完全匹配。

私有仓库必须用 HTTPS + 自定义 CA 才算真正安全
HTTP 或自签名证书的私有仓库,哪怕加了认证,也存在中间人劫持风险。Composer 默认只信任系统 CA,而企业内网通常用自建 CA 签发证书,不配置 ssl.cafile,composer install 就会静默 fallback 到系统默认证书链,结果仍是 cURL error 60 —— 表面报错,实则是证书未被识别。
关键不是“能不能连上”,而是“连上的是否真是你的私有源”。实操必须满足三点:
-
ssl.cafile指向的必须是完整 PEM 链:中间 CA 在前、根 CA 在后,不能含注释或空行;用cat intermediate.pem root.pem > ca-bundle.pem拼接最稳妥 - 必须用
composer config --global ssl.cafile /path/to/ca-bundle.pem全局设置;项目级配置(不带--global)对网络层 TLS 握手无效 - PHP 进程需有读权限:若用 php-fpm,确保
www-data或对应用户能读该文件;放在/etc/ssl/certs/下比家目录更可靠
type 选错会导致整个私有源被 Composer 忽略
私有仓库分两类,连接方式和安全要求完全不同:vcs(如 GitLab 私有库)走 Git 协议或 HTTPS + token,composer(如 Satis/Nexus 镜像)走 HTTP(S) + packages.json。二者混用或类型填错,Composer 不报错,但直接跳过你的配置。
常见踩坑点:
- 把 Satis 地址写成
"type": "vcs"—— 它不是 Git 仓库,是 Composer 协议服务,必须是"type": "composer" - GitLab 私有库用了 HTTPS 地址却配成
"type": "composer"—— 会尝试请求/packages.json,404 后静默 fallback 到 packagist.org - URL 末尾漏掉
/,比如"url": "https://satis.internal"→ 实际请求变成https://satis.internal/packages.json(404),而不是https://satis.internal//packages.json(Nginx 可能重写)
packagist.org 必须显式禁用,否则安全配置形同虚设
即使你写了私有源、配了 CA、URL 也正确,只要没关默认源,Composer 就坚持先连外网查 packagist.org。一旦公网通(比如 CI 环境没断网),它就永远优先走官方源——你的私有包根本不会被拉取,更别说走你配的 CA 验证了。
必须在项目级 composer.json 的根层级加这一行:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
{"packagist.org": false}
注意细节:
- 键名严格为
packagist.org(带点、小写、无复数 s),写成packagist或repositories.packagist全无效 - 必须和
repositories同级,不能嵌在config或extra里 - 不要在全局
~/.composer/config.json里设这个——它只影响全局命令,不控制项目install/update的源行为
auth.json 里的域名 key 必须与仓库 URL host 完全一致
当私有仓库用 HTTPS + token 认证(如 GitLab/GitHub),auth.json 是唯一安全存 token 的位置。但它对域名匹配极其敏感:协议、端口、大小写、子域差一点,token 就不会被发送。
例如,仓库 URL 是 https://gitlab.company.local:8443,那么 auth.json 中的 key 必须是:
{"gitlab.company.local:8443": {"token": "xxx"}}
而不是 gitlab.company.local 或 https://gitlab.company.local:8443(带协议)。
其他要点:
- GitLab token 权限至少要
read_repository;GitHub 要reposcope - 若仓库用了反向代理(如 Nginx 前置),
auth.json的 key 应填代理后的域名,不是后端真实地址 - CI/CD 中建议用环境变量注入
COMPOSER_AUTH,避免硬编码或误提交auth.json
packagist.org 是否真被禁用、以及 auth.json 域名是否一字不差匹配请求 host —— 这三处任一出错,HTTPS 就退化成裸连。










