应优先修复证书链而非关闭SSL验证;根本原因是系统缺少可信CA证书包或PHP的curl未正确指向证书路径;推荐方案是下载cacert.pem并配置php.ini中的curl.cainfo,重启后验证;临时禁用仅限测试环境。

Composer 安装或更新时遇到 SSL 证书错误(如 cURL error 60、SSL certificate problem: unable to get local issuer certificate),不是该关 SSL 验证,而是优先修复证书链;只有在明确处于离线开发、内网环境或临时调试时,才考虑关闭验证——且必须清楚后果。
为什么 Composer 会报 SSL 证书错误
根本原因通常是系统缺少可信 CA 证书包,或 PHP 的 curl 扩展未正确指向证书路径(尤其 Windows XAMPP/MAMP、macOS Homebrew PHP、Docker Alpine 环境常见)。Composer 默认强制校验 HTTPS 连接安全性,不接受自签名、过期或无法链到根证书的站点证书。
常见表现:
[Composer\Downloader\TransportException] The "https://packagist.org/packages.json" file could not be downloaded: SSL operation failed with code 1...cURL error 60: SSL certificate problem: unable to get local issuer certificate- 执行
composer diagnose提示curl: (60) SSL certificate problem
推荐方案:配置正确的 CA 证书路径(Windows/macOS/Linux 通用)
比关 SSL 更安全、更可持续。关键是让 PHP/curl 知道去哪里找 CA 根证书文件。
- 下载最新 CA 包:访问 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251,保存为本地文件(例如
C:\certs\cacert.pem或/usr/local/etc/php/cacert.pem) - 找到 PHP 配置文件
php.ini(运行php --ini查看位置) - 在
php.ini中添加或修改这一行:curl.cainfo = "/path/to/cacert.pem"(Windows 路径用正斜杠或双反斜杠,如C:/certs/cacert.pem) - 重启 Web 服务或 CLI 环境,运行
php -r "print_r(openssl_get_cert_locations());"确认cafile指向正确路径 - 再试
composer diagnose,应显示HTTPS is working
临时方案:仅限测试环境,禁用 Composer 的 SSL 验证
这不是修复,是绕过。仅用于无法控制网络环境(如公司代理拦截 HTTPS、老旧 Docker 基础镜像)的临时调试。生产环境绝对禁止。
- 全局关闭(影响所有项目):
composer config -g secure-http false - 同时需禁用 CA 校验(否则仍会失败):
composer config -g cafile "" - 或者直接设 curl 选项(等效):
composer config -g http.sslverifypeer false - 注意:执行后
composer diagnose会警告secure-http is disabled,且 Packagist.org 等源可能拒绝连接(2024 年起已强制 HTTPS + 有效证书)
Docker 或 CI 环境中的典型处理方式
Alpine Linux(常用作基础镜像)默认不含完整 CA 包,容易出错。
- 构建时安装证书:
RUN apk add --no-cache ca-certificates - 确保 PHP 编译时启用了
--with-curl且链接系统证书路径 - 避免写死
cafile到镜像中;优先用系统级证书更新机制(如update-ca-certificates) - 若使用私有 Packagist 镜像且证书由内网 CA 签发,需把该 CA 证书合并进系统
/etc/ssl/certs/ca-certificates.crt并运行update-ca-certificates
真正难的不是关不关 SSL,而是搞清证书信任链断在哪一环——是 PHP 没读到证书?是容器里压根没装 CA 包?还是你的代理在中间做了 TLS 解密却没推送根证书?定位清楚再动手,比一行 config -g secure-http false 管用得多。










