根本原因是PHP的OpenSSL或cURL扩展找不到可信根证书文件,最稳妥解法是修改php.ini中curl.cainfo和openssl.cafile指向有效的cacert.pem绝对路径。

Composer 报 SSL certificate problem: unable to get local issuer certificate,本质不是 Composer 问题,而是 PHP 的 OpenSSL 或 cURL 扩展找不到可信的根证书文件。直接改 php.ini 指向有效 cacert.pem 是最稳解法,其他都是临时绕行。
为什么 composer install 突然卡在 SSL 验证失败
错误通常长这样:SSL operation failed with code 1. OpenSSL Error messages: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed。这不是 Composer 自身 bug,而是它底层调用 PHP 的 file_get_contents() 或 cURL 时,证书链校验失败。常见触发点包括:
- Windows 用户没配
curl.cainfo和openssl.cafile,或路径写错(比如用了反斜杠没转义) - macOS 更新后系统自带 OpenSSL 被替换,但 PHP 仍指向旧证书路径(如
/etc/ssl/cert.pem已失效) - Linux 上
ca-certificates包过老,或 PHP 编译时没链接系统 OpenSSL - 本地开了代理、杀毒软件 HTTPS 扫描,或
hosts文件误绑了packagist.org
验证是不是环境级问题:运行 curl -I https://packagist.org。如果也失败,说明得修底层,不是 Composer 单独能救的。
正确配置 php.ini 中的 CA 证书路径
这是推荐优先做的动作,一劳永逸且安全。步骤很明确:
- 下载最新
cacert.pem:从https://curl.haxx.se/ca/cacert.pem保存到本地固定路径,比如C:\php\cacert.pem(Windows)或/opt/homebrew/etc/openssl@3/cert.pem(macOS Homebrew) - 运行
php --ini找到正在生效的php.ini位置 - 编辑该文件,确保
extension=openssl未被注释;然后取消注释并设置两行:
curl.cainfo="/path/to/cacert.pem" openssl.cafile="/path/to/cacert.pem"
注意:路径必须是**绝对路径**,Linux/macOS 用正斜杠,Windows 若用反斜杠需双写("C:\php\cacert.pem")或改用正斜杠("C:/php/cacert.pem")。改完重启 CLI 环境(关掉再开终端)或 Web 服务。
临时跳过证书验证只适用于调试
生产环境禁用 SSL 校验等于裸奔,不解决根本问题,还可能被中间人攻击。仅限内网测试或紧急排障:
- 单次命令跳过(最小影响):
composer install --no-secure-http—— 注意这只是关掉「强制仓库用 HTTPS」,不等于跳过证书校验 - 真正绕过 PHP 层证书检查,需设环境变量:
COMPOSER_NO_SSL=1 composer install(Linux/macOS)或set COMPOSER_NO_SSL=1 && composer install(Windows CMD) - 全局关 TLS(极不推荐):
composer config -g disable-tls true+composer config -g secure-http false,之后所有包都走 HTTP,风险自担
这些操作不会修复 php.ini 里缺失的证书路径,下次换环境或重装 PHP 还会复现。
镜像源不能替代证书配置
切阿里云镜像(composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/)能缓解网络抖动或 DNS 污染,但**不解决证书验证失败**。因为镜像站同样用 HTTPS,照样要校验证书链。如果你连 curl -I https://mirrors.aliyun.com/composer/ 都失败,说明证书问题还在,镜像只是把错误从 packagist.org 换成 mirrors.aliyun.com 而已。
真正容易被忽略的是:PHP CLI 和 Web SAPI(如 Apache mod_php 或 php-fpm)可能加载不同的 php.ini,改完记得分别验证 php -i | grep "Loaded Configuration File" 和 phpinfo() 页面里的路径是否一致。证书路径配错一个,就有一个环境继续报错。


















