应修改php.ini中curl.cainfo和openssl.cafile为同一绝对路径的cacert.pem并重启环境;其他如composer config --global cafile或禁用ssl等方法均无效,因composer依赖php底层curl/opennssl验证。

composer 安装 ThinkPHP(TP)时因 SSL 证书错误失败,不是 TP 的问题,而是 PHP 底层 HTTPS 验证环节断了——**改 php.ini 才真有效,其他操作基本白忙**。
查清当前 PHP 用的证书路径是第一步
很多同学直接改 composer config --global cafile 或加 --no-secure-http,结果没用。因为 Composer 下载包走的是 PHP 的 cURL 或 OpenSSL 扩展,不是它自己的 HTTP 客户端。
先运行这行命令看 PHP 实际加载的证书位置:
php -r "print_r(openssl_get_cert_locations());"
重点关注输出里的 default_cert_file 和 ini_cafile 字段。如果值为空、路径不存在、或文件大小为 0,就确认是这里坏了。
- Linux/macOS 常见路径:
/etc/ssl/certs/ca-certificates.crt或/usr/local/etc/php/cacert.pem - Windows 常见路径:
C:phpextrassslcacert.pem(注意用双引号包裹,反斜杠要写成\或用正斜杠/) - 如果路径存在但文件损坏,直接删掉重下;如果路径压根不存在,下一步就得手动配
改对 php.ini 的 curl.cainfo 和 openssl.cafile
这两个配置必须同时设、路径完全一致,否则仍有概率失效。只设一个,或路径写错(比如漏了 .pem 后缀、用了相对路径),都会继续报错。
去 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载最新 cacert.pem,存到你选好的绝对路径,然后在 php.ini 末尾加:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
curl.cainfo = "/usr/local/etc/php/cacert.pem" openssl.cafile = "/usr/local/etc/php/cacert.pem"
Windows 用户写法示例:
curl.cainfo = "C:/php/extras/ssl/cacert.pem" openssl.cafile = "C:/php/extras/ssl/cacert.pem"
- 改完必须重启:CLI 模式要关掉终端重开;Web 环境要重启
php-fpm、Apache 或 Nginx - 验证是否生效:
php -r "var_dump(file_get_contents(ini_get('curl.cainfo')) !== false);"输出bool(true)才算成功 -
composer diagnose中如果还提示ssl.capath is not configured,说明没改对位置——确认你改的是 CLI 模式下php --ini显示的那个php.ini,不是 Apache 用的那一个
为什么 COMPOSER_DISABLE_TLS=1 不是解法
这个环境变量确实能让 composer install 过去,但它会让所有 HTTPS 请求降级成 HTTP,包源域名可能被劫持、依赖被篡改——CI 流水线、生产服务器、任何有真实数据的环境都绝不能用。
-
-k参数在 Composer 2.2+ 已废弃,强行用会报Unknown option: -k -
composer config --global secure-http false只影响“能否添加非 HTTPS 仓库”,跟证书验证失败完全无关 - 切国内镜像(如阿里云)也解决不了问题:镜像地址仍是 HTTPS,证书链不信任照样报错
ThinkPHP 项目里还有个容易被忽略的点
TP 自身不控制证书验证逻辑,但如果你用的是私有 Packagist 镜像、或公司内网自建的 Composer 仓库,且该服务用了自签名证书,那么仅靠系统 CA 包还不够。
- 得把内网 CA 的
.crt文件追加进你正在用的cacert.pem里:cat internal-ca.crt >> /path/to/cacert.pem - 别用
http://替代https://配置仓库——Packagist 已全站强制 HTTPS,composer config -g repo.packagist composer http://...会直接失败 - 如果走代理,确保
HTTPS_PROXY环境变量指向支持 CONNECT 的代理服务,且代理本身证书已被 PHP 信任
最常卡住的地方其实是:改了 Web SAPI 的 php.ini,却忘了 CLI 模式下加载的是另一个文件;或者证书路径写了 ./cacert.pem 这种相对路径,PHP 根本找不到。










