curl error 60 的本质是 PHP 无法加载有效的 CA 根证书文件,导致 HTTPS 证书链验证失败;需通过 openssl_get_cert_locations() 检查 default_cert_file 路径有效性,并优先使用系统自带的 ca-certificates 包而非手动下载 cacert.pem。

curl error 60 的本质是 PHP 找不到可信根证书
报错 curl error 60: SSL certificate problem: unable to get local issuer certificate 不代表网络不通,而是 PHP 的 cURL 或 OpenSSL 扩展在发起 HTTPS 请求时,无法验证远端服务器(如 https://packagist.org)的证书链——它压根没加载任何有效的 CA 根证书文件。
关键判断依据是运行:
php -r "print_r(openssl_get_cert_locations());"看输出里的
default_cert_file 是否为空、路径不存在,或指向一个空/损坏的 PEM 文件。很多 Windows 集成环境(XAMPP/WAMP)、Docker Alpine 镜像、或源码编译的 PHP 都会遇到这个路径“形同虚设”的问题。
优先用系统级 CA 包,别手动下载 cacert.pem
虽然 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 是常见方案,但它只是 Mozilla CA 列表的快照,容易过期;而操作系统自带的 CA 包(如 ca-certificates)会随系统更新自动维护,更可靠。
- Ubuntu/Debian:
sudo apt update && sudo apt install --reinstall ca-certificates
,然后确认php -r "print_r(openssl_get_cert_locations());"中default_cert_file指向/etc/ssl/certs/ca-certificates.crt - CentOS/RHEL 8+:
sudo dnf reinstall ca-certificates
,证书路径通常是/etc/pki/tls/certs/ca-bundle.crt - macOS(Homebrew PHP):
brew reinstall ca-certificates
,再检查是否指向/opt/homebrew/etc/ca-certificates/cert.pem(路径因 OpenSSL 版本略有差异) - Windows(XAMPP/WAMP):打开
php.ini,确保curl.cainfo和openssl.cafile都明确指向一个真实存在的 PEM 文件,例如:curl.cainfo = "C:/xampp/php/extras/ssl/cacert.pem"—— 如果该文件不存在,才去下载并放进去
让 Composer 自己带证书,不碰 php.ini
如果你无权改全局 php.ini(比如共享主机、CI 环境),或想避免影响其他 PHP 应用,最干净的方式是只给 Composer 单独指定 CA 路径。注意:Composer 2.2+ 支持按仓库粒度配置,比旧版 cafile 更精准:
- 对 Packagist 使用系统证书(推荐):
composer config --global repo.packagist.org.ssl.certificate-authority /etc/ssl/certs/ca-certificates.crt
- 若只想全局生效(兼容旧版行为):
composer config --global cafile /etc/ssl/certs/ca-certificates.crt
- 验证是否写入:
cat %APPDATA%\Composer\config.json
(Windows)或cat ~/.composer/config.json
(Linux/macOS),应看到"cafile"或"certificate-authority"字段
这条命令会写入 Composer 的全局配置,不影响 PHP 其他扩展,也无需重启服务。
临时绕过验证仅限调试,且有明确风险边界
禁用 SSL 校验不是“解决方案”,而是快速定位问题的诊断手段。一旦确认是证书问题,就必须回归上述配置,否则会引入严重风险:
-
composer config --global secure-http false:允许 Composer 访问 HTTP 源(极不安全,包可能被中间人篡改) -
composer config --global disable-tls true:彻底关闭 TLS,等同于裸奔下载依赖 - 仅当前命令跳过(稍可控):
COMPOSER_NO_SSL=1 composer install
(Linux/macOS)或set COMPOSER_NO_SSL=1 && composer install
(Windows)
切记:虚拟机、CI 流水线、Docker 构建镜像里时间不准也会触发类似报错——运行 date 确认系统时间是否正确,尤其是年份和时区。证书验证失败,有时真不是证书的事,是你的电脑“活在去年”。










