关掉代理后 composer install 成功,说明 composer 正在继承系统级 http_proxy/https_proxy 变量,而代理工具(如 clash、surge)对 https 流量做了 mitm 拦截,但 php 的 openssl 不信任其根证书,导致 curl error 35 或握手失败。

为什么关掉代理后 composer install 就成功了
说明 Composer 正在继承系统级代理变量(HTTP_PROXY、HTTPS_PROXY),而你的代理工具(Clash、Surge、某些国产加速器)对 HTTPS 流量做了 MITM 拦截,但 PHP 的 OpenSSL 并不信任它的根证书。这不是证书过期或域名错,而是握手阶段被拒绝——典型表现是 cURL error 35、SSL routines:ssl3_read_bytes:sslv3 alert handshake failure,甚至卡在 Updating dependencies 不报错。
composer config --global github-oauth.github.com 不生效的真正原因
这个命令只影响 GitHub 的 OAuth 认证,和系统代理完全无关。如果你连 packagist.org 都请求不了,那问题根本不在 GitHub 凭据上。真正要检查的是:
-
composer config --global --list | grep -E "(http-basic|github-oauth|gitlab-token)"—— 看输出是否为空;空就代表没写进去,不是“不生效”,是压根没存 -
env | grep -i proxy—— 查看当前 shell 是否还带着HTTPS_PROXY变量 -
composer diagnose—— 关键看最后一行是否提示curl error 60或Failed to enable crypto
让 Composer 信任代理根证书的实操路径
别删代理,要让它被 PHP 正确识别。Clash for Windows、Surge 等工具首次启动时都会导出根证书(通常叫 ClashCA.crt 或 surge-ca.pem)。你需要做的是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 找到那个证书文件,确认是 PEM 格式(文本开头为
-----BEGIN CERTIFICATE-----) - 运行
composer config -g cafile /path/to/your-proxy-ca.crt(Linux/macOS)或composer config -g cafile "C:\path\to\ClashCA.crt"(Windows) - 验证:执行
composer config -g cafile,输出必须是你填的完整路径 - 注意:不要用
/dev/null或false绕过校验——这会打开中间人攻击面,CI 环境尤其危险
项目里写了 "repositories" 就会忽略全局镜像
哪怕你已经用 composer config -g repo.packagist 配好了阿里云镜像,只要项目根目录 composer.json 里有 "repositories" 字段(哪怕只是空数组 []),Composer 就会彻底跳过全局配置,直连 packagist.org。这时候你看到的 composer install -vvv 日志第一行是 Downloading https://packagist.org/packages.json,就说明它根本没走镜像。
临时验证方法:composer config --unset repositories(不加 -g),再跑一次 composer install -vvv,看 Downloading 行的域名是不是你配的镜像地址。










