Composer 报 cURL error 60 是因 PHP/cURL 无法验证 SSL 证书,主因是 Windows 下未正确配置 curl.cainfo 指向可信 CA 证书文件;需下载 cacert.pem、在 php.ini 中设置路径并重启 CLI 环境。

为什么 Composer 会报 cURL error 60:SSL certificate problem
这是 cURL 在发起 HTTPS 请求时,无法验证远程服务器(如 packagist.org)的 SSL 证书导致的。常见于 Windows 系统下安装的 PHP 自带 cURL 没有内置可信 CA 证书包,或系统证书路径配置错误。不是网络不通,也不是 Composer 本身坏了,而是证书链校验失败。
- 典型错误信息:
cURL error 60: SSL certificate problem: unable to get local issuer certificate - 只在本地开发环境高频出现,Linux/macOS 通常自带 CA 证书,Windows WAMP/XAMPP/PHPStudy 等集成环境最常中招
- 临时禁用 SSL 校验(
curl.cainfo置空或设verify-peer = false)看似能跑通,但会带来中间人攻击风险,不推荐长期使用
正确设置 PHP 的 curl.cainfo 路径
核心是让 PHP/cURL 知道去哪里找权威 CA 证书文件。Composer 依赖 PHP 的 cURL 扩展,而该扩展读取 php.ini 中的 curl.cainfo 配置项。
- 下载最新 CA 证书包:访问 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251,保存为
cacert.pem(不要用浏览器另存为 HTML,要确保内容是 PEM 格式文本) - 把它放在一个**无中文、无空格、权限可读**的路径,例如:
C:\php\extras\ssl\cacert.pem - 编辑你的
php.ini文件(运行php --ini查看加载路径),取消注释或新增一行:curl.cainfo = "C:\php\extras\ssl\cacert.pem" - 重启 Web 服务或 CLI 环境,执行
php -r "print_r(openssl_get_cert_locations());",确认cafile输出与你设置的路径一致
验证是否生效 & 常见失效原因
改完配置别急着跑 composer install,先快速验证底层 cURL 是否已就绪。
- 执行:
php -r "$ch = curl_init('https://packagist.org'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); var_dump(curl_exec($ch));"—— 若返回非 false,说明证书链已通 - 如果仍报错,检查:
php --ini是否指向你修改的php.ini;CLI 和 Web SAPI 的php.ini可能不同,Composer 走的是 CLI 版本 - 路径中用了反斜杠
\却没加引号,Windows 下会被误解析为转义字符 → 必须用双引号包裹完整路径 - 证书文件被杀毒软件拦截或权限被限制(尤其在 Program Files 下),换到用户目录如
C:\Users\YourName\cacert.pem更稳妥
Composer 自身证书配置(备用方案)
当 PHP 层无法修改(如共享主机、Docker 容器内无权改 php.ini)时,可用 Composer 的全局 config 强制指定 CA 路径,它会覆盖 PHP 默认行为。
- 执行:
composer config -g cafile "C:\php\extras\ssl\cacert.pem" - 该命令将写入
COMPOSER_HOME/config.json,等价于手动添加:"cafile": "C:\\php\\extras\\ssl\\cacert.pem" - 注意:路径中的反斜杠必须双写(JSON 字符串转义),或改用正斜杠
C:/php/extras/ssl/cacert.pem - 此方式仅影响 Composer,不影响其他 PHP cURL 调用;若同时设置了
php.ini和composer config,后者优先级更高










