自定义仓库连接失败主因是DNS、端口或TLS握手问题,非仓库本身故障;需依次验证Composer配置地址、curl -I测试、SNI匹配、端口合规性、防火墙SNI透传及CA证书路径。

自定义仓库连接失败,90% 以上不是仓库本身问题,而是 Composer 请求根本没发出去——卡在 DNS、端口或 TLS 握手环节。
curl -I 测试前先确认实际请求地址
别直接跑 composer install,它会绕过很多底层错误。先查 Composer 当前到底连谁:
- 运行
composer config -g repo.packagist,看返回的url是不是你配的自定义地址(注意末尾必须有/) - 手动用
curl -I https://your-repo.example.com/packages.json测试——如果这里就Connection refused或超时,Composer 肯定失败 - 若
curl成功但 Composer 失败,大概率是 TLS SNI 不匹配:检查curl -v https://your-repo.example.com 2>&1 | grep "Server Name"是否带出你期望的域名
端口不是 443 就别硬扛 HTTPS
Composer 默认只走标准 HTTPS 端口(443),不支持 https://host:8443 这类非标端口写法。强行写进去会导致 URL 拼接错误,最终请求变成 https://host:8443//packages.json(双斜杠)而 404。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 自定义仓库必须监听 443 端口,且证书 Subject 或 SAN 必须包含你配置的域名
- 如果只能开其他端口(如 8080),改用 HTTP 协议:
composer config -g repo.myrepo composer http://your-repo.example.com/,并确保secure-http关闭:composer config -g secure-http false - HTTP 方式仅限内网可信环境;公网暴露 HTTP 仓库等于公开所有包元数据
防火墙放行要精确到 SNI 和域名
企业防火墙常拦截 TLS 握手阶段的 SNI 扩展,而非单纯封端口。只开 443 不够,curl 可能成功但 Composer 失败,就是因为 PHP 的 cURL 库发送的 Client Hello 中 SNI 字段被丢弃。
- 必须放行的域名:你配置的仓库域名(如
your-repo.example.com),不是packagist.org - 必须允许 SNI 扩展携带该域名——部分防火墙策略需显式开启 “SNI 透传” 或 “TLS Server Name Indication” 选项
- 验证方法:用
tcpdump抓包,过滤host your-repo.example.com and port 443,看 Client Hello 的 SNI 是否为预期值
CA 证书路径错位比证书过期更常见
报 SSL certificate problem: unable to get local issuer certificate 时,90% 是 PHP 根本没读到系统 CA 包,而不是证书真的无效。
- 执行
php -r "print_r(openssl_get_cert_locations());",确认default_cert_file指向真实存在的 PEM 文件(如/etc/ssl/certs/ca-certificates.crt) - 如果路径为空或文件不存在,在容器或精简系统(如 Alpine)中很常见,需手动指定:
composer config -g cafile /etc/ssl/certs/ca-certificates.crt - 不要用网上随便下载的
cacert.pem,优先绑定系统级 CA 包,避免证书更新后失效
真正卡住的地方,往往是你以为“已经通了”的那一步——比如 curl 成功了,但没验证 SNI;或者防火墙开了域名,却没放开 SNI 透传;又或者 cafile 配了路径,但 PHP 进程根本没 reload。这些点不逐个击穿,换源或重装 Composer 都没用。

















