Composer中文镜像报SSL证书问题本质是PHP/cURL不信任企业自签名根证书,需通过追加CA证书至curl.cainfo或临时禁用校验(仅调试)解决,而非修改镜像地址或Composer配置。

Composer用中文镜像时突然报SSL certificate problem
这不是镜像本身的问题,而是你配置的中文镜像(如https://mirrors.aliyun.com/composer/)用了企业自签名证书,而 PHP/cURL 没认这个根证书。报错典型是SSL certificate problem: unable to get local issuer certificate或CURLOPT_SSL_VERIFYPEER failed。
别急着删镜像或切回官方源——先确认是不是证书问题:临时加--disable-tls跑一次composer update -v。如果能走通,说明确实是证书校验拦住了,不是网络或镜像地址写错。
- 检查镜像 URL 是否带
https:写成http会跳过 SSL,但多数中文镜像不支持 HTTP,强行改可能 403 - 确认你没在环境变量里设
COMPOSER_REPO_PACKAGIST——它优先级高于全局配置,会掩盖镜像设置 - 运行
composer config repo.packagist,输出必须是你配的中文镜像地址,否则配置根本没生效
临时绕过证书校验(仅限开发机或CI单次构建)
生产环境严禁这么做,但调试时能快速验证和推进。关键是控制 cURL 行为,不是改composer.json。
Linux/macOS 下执行:
COMPOSER_CAFILE=/dev/null composer update -v
Windows 命令行下:
set COMPOSER_CAFILE=&& composer update -v
注意:--disable-tls会彻底关 HTTPS,只在源明确支持 HTTP 且你信得过链路时才用;COMPOSER_CAFILE=/dev/null更轻量,只跳过证书链校验,仍走 HTTPS 加密。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 别用
php -d openssl.cafile=...,PHP 的 openssl 配置不被 Composer 的 cURL 层读取 - 每次命令前都得加环境变量,shell session 关闭就失效,不会污染系统
- CI 脚本里用这种写法没问题,但记得加注释说明“仅限当前 job”
让中文镜像真正信任你的企业根证书(生产环境唯一正解)
核心是把 PEM 格式的企业 CA 根证书追加到 PHP 实际使用的curl.cainfo文件末尾。不是替换,是追加;不是改 Composer 配置,是改 PHP 底层信任库。
分三步:
- 运行
php -i | grep 'curl.cainfo',找到真实路径(常见如/etc/php/8.1/cli/curl.cainfo) - 用
cat your-company-root-ca.crt >> /path/to/curl.cainfo追加内容(确保.crt是 PEM 格式,以-----BEGIN CERTIFICATE-----开头) - 不需要重启 PHP-FPM 或 Apache,CLI 进程下次启动时自动读新文件
验证是否生效:运行php -r "print_r(openssl_get_cert_locations());",看default_cert_file指向的路径是否包含你刚追加的证书内容。
中文镜像 + 自签名证书下容易被忽略的坑
IDN 域名(比如含中文或中文拼音的子域名)必须转 Punycode,否则证书 Subject 不匹配;很多企业内网镜像用了mirrors.公司名.内网这类域名,OpenSSL 默认不处理 Unicode 域名。
- 用
idn --quiet --punycode mirrors.公司名.内网生成 Punycode 形式(如xn--mirrors-xxx.xxx),再配进镜像 URL - 证书链必须完整:光有根证书不够,中间 CA 证书也得一并追加到
curl.cainfo,否则仍报unable to get local issuer certificate - Composer 2.2+ 默认启用
verify-peer,不能靠config --global secure-http false绕过,这个配置已被废弃
最常卡住的点不在 Composer 层,而在 OpenSSL 对证书链和域名的严格校验——盯着报错里的“issuer”和“subject”字段比反复换镜像有用得多。

















