composer diagnose 默认只验证 packagist.org 的 https 证书和 tls 握手,不检测私有仓库;需手动用 curl -iv 测试私有源 /packages.json 的证书有效性、状态码及域名匹配性。

composer diagnose 不会自动测私有源 HTTPS 证书
它默认只检查 packagist.org 的 TLS 握手和证书有效性,哪怕你在 composer.json 里配了十个私有仓库,composer diagnose 也不会主动去请求它们的 /packages.json。所以“diagnose 没报错”不等于私有源证书就 OK。
真正要验证,得手动模拟 Composer 的行为:
- 用
curl -Iv https://your-private-repo.com/packages.json看 TLS 握手是否成功、状态码是不是 200 - 重点观察输出里的
* SSL certificate verify result:行——要是出现unable to get local issuer certificate或CN mismatch,说明证书链不全或域名对不上 - 如果私有源启用了 Token Authentication(比如 Artifactory 的
Enable Token Authentication),旧版 Composer 客户端可能在 SSL 层就断连,可临时关掉该选项复测
ssl.cafile 必须指向完整 PEM 链,且需全局配置
composer config --global ssl.cafile /path/to/company-ca.pem 这条命令本身不保证生效——文件格式、路径权限、PHP 进程读取能力缺一不可。
常见翻车点:
- 证书文件不是纯 PEM 格式:开头必须是
-----BEGIN CERTIFICATE-----,不能有 BOM、空行、注释;用openssl x509 -in ca.crt -text -noout先确认 - 只放了根 CA,漏了中间 CA:合并顺序应为「中间 CA 在前、根 CA 在后」,用
cat intermediate.pem root.pem > combined.pem比手动拼接更可靠 - 权限问题:PHP 进程(如
www-data)可能读不了家目录下的证书文件,优先放系统可信路径如/etc/ssl/certs/ - Composer ≥2.5 会先尝试用
ssl.cafile初始化 OpenSSL 上下文,失败则静默 fallback 到系统 CA——所以没报错≠证书被加载
认证失败会导致安全审计静默跳过整个源
私有源若需要 Basic Auth 或 Bearer Token,但 auth.json 里 host 键不匹配(比如仓库 URL 是 https://pkg.myorg.com/,而 auth.json 写的是 "myorg.com" 或 "https://pkg.myorg.com"),Composer 在拉取 packages.json 阶段就会失败。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
此时 composer audit 不会报错,也不提示“某源不可达”,而是直接忽略该仓库下所有包——你看到的 “No vulnerabilities found” 很可能是假阴性。
验证方式:
- 运行
composer -vvv require your-privatelib/name 2>&1 | grep "Authentication",看到Using HTTP basic authentication for pkg.myorg.com才算认证触发成功 - 确保
auth.json权限是600(Linux/macOS),否则 Composer 会静默忽略 - 全局
auth.json默认路径是~/.composer/auth.json,项目级则是项目根目录下的auth.json
私有源 type 和尾斜杠决定它能不能进 audit 流程
composer audit 只审计那些被识别为 "type": "composer" 的仓库返回的包。如果你把私有源写成 "type": "vcs" 或干脆不写 type 字段,哪怕 URL 能返回 packages.json,audit 也完全不会去查它。
必须同时满足这三点,私有包才可能出现在审计结果里:
-
repositories数组中该项的type值严格为"composer" -
url末尾带斜杠(如"https://pkg.myorg.com/"),否则请求/packages.json会 404 - 同级声明
"packagist.org": false,否则 Composer 仍优先走官方源,你的私有包根本不会被解析进composer.lock
漏掉任意一项,audit 就当它不存在——不是报错,是彻底跳过。










