错误原因是 PHP 的 cURL 扩展找不到可信 CA 证书链,解决方法是正确配置 php.ini 中的 curl.cainfo 指向有效的 PEM 文件,或临时禁用 SSL 验证(仅调试用)。

curl: (60) SSL certificate problem: unable to get local issuer certificate
这是 Composer 在 Windows 或某些 Linux 环境下最典型的证书验证失败报错,本质不是 Composer 本身的问题,而是 PHP 的 cURL 扩展找不到可信的 CA 证书链。它常发生在刚装完 XAMPP、WAMP、或手动编译 PHP 后未配置证书路径时。
核心解决思路只有两个方向:告诉 cURL 去哪找证书(推荐),或者临时关掉证书验证(仅调试用,不安全)。
-
优先检查
php.ini中是否设置了curl.cainfo:打开你的php.ini文件,搜索curl.cainfo,确认它指向一个真实存在的 PEM 文件,例如:c:\xampp\apache\bin\cacert.pem或/etc/ssl/certs/ca-certificates.crt - 如果没设置,去 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载最新
cacert.pem,保存到本地某路径(比如C:\php\cacert.pem),然后在php.ini中写入:curl.cainfo = "C:\php\cacert.pem" - 改完
php.ini必须重启 Web 服务或 CLI 环境(比如重启 Apache、或重新打开终端),否则不生效 - 验证是否生效:运行
php -r "print_r(curl_version());",看输出里features是否含CURL_VERSION_SSL;再运行php -r "var_dump(openssl_get_cert_locations());",确认default_cert_file路径和你设的curl.cainfo一致
composer install/update 报错 60 但 php -v 正常
这说明 PHP CLI 和 Web Server(如 Apache)可能用了不同的 php.ini,而 Composer 走的是 CLI 的配置。很多人只改了 Apache 的 php.ini,却忘了 CLI 的那一份。
快速定位你当前 Composer 用的是哪个 php.ini:
- 运行
php --ini,看输出的 “Loaded Configuration File” 路径 - 运行
composer diagnose,它会明确告诉你 “The openssl extension is loaded” 和 “The curl extension is loaded”,但不会说证书路径对不对——所以仍要靠php --ini+curl.cainfo双重确认 - Windows 上常见陷阱:XAMPP 的 CLI
php.ini默认在\xampp\php\php.ini,而 Apache 用的是\xampp\apache\bin\php.ini,两者是独立文件
临时绕过证书验证(仅限离线/测试环境)
不推荐长期使用,但当你在受限网络、内网代理、或快速验证是否真是证书问题时,可以加参数跳过验证:
- 给单条命令加
-d openssl.cafile=(空值):php -d openssl.cafile= composer install - 或直接禁用 cURL 的 SSL 验证(更粗暴):
php -d curl.cainfo= composer update - 注意:
COMPOSER_DISABLE_TLS=1环境变量也有效,但它会降级为 HTTP 协议,存在中间人风险,别在 CI 或生产机器上设成全局
Linux/macOS 下 ca-certificates 更新后仍报错 60
系统级证书更新了,但 PHP 的 cURL 没读到新位置,尤其常见于 Docker 容器、Ubuntu 22.04+、或自编译 PHP。
- 先查系统证书路径:
openssl version -d输出的OPENSSLDIR通常是/usr/lib/ssl,里面应有certs/ca-certificates.crt - 检查
curl.cainfo是否指向该路径,例如:curl.cainfo = "/etc/ssl/certs/ca-certificates.crt" - 某些 Alpine Linux 容器默认没装
ca-certificates包,需先运行apk add ca-certificates再update-ca-certificates - PHP-FPM 场景下,改完
php.ini后必须重启php-fpm进程,service php-fpm restart或systemctl restart php-fpm
证书路径一旦配错,所有基于 cURL 的 PHP 操作(不只是 Composer)都会出 60 错,包括 Guzzle、file_get_contents HTTPS 请求。最容易被忽略的是:CLI 和 Web SAPI 的 php.ini 分离、Docker 容器里证书文件权限为只读、以及改完配置忘记重启进程。










