Composer报错cURL error 60_解决Composer本地SSL证书认证【避坑】

6次阅读

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

Composer报错cURL error 60_解决Composer本地SSL证书认证【避坑】

为什么 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:phpextrassslcacert.pem
  • 编辑你的 php.ini 文件(运行 php --ini 查看加载路径),取消注释或新增一行:curl.cainfo = "C:phpextrassslcacert.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:UsersYourNamecacert.pem 更稳妥

Composer 自身证书配置(备用方案)

当 PHP 层无法修改(如共享主机、docker 容器内无权改 php.ini)时,可用 Composer 的全局 config 强制指定 CA 路径,它会覆盖 PHP 默认行为。

  • 执行:composer config -g cafile "C:phpextrassslcacert.pem"
  • 该命令将写入 COMPOSER_HOME/config.json,等价于手动添加:"cafile": "C:\php\extras\ssl\cacert.pem"
  • 注意:路径中的反斜杠必须双写(json 字符串转义),或改用正斜杠 C:/php/extras/ssl/cacert.pem
  • 此方式仅影响 Composer,不影响其他 PHP cURL 调用;若同时设置了 php.inicomposer config,后者优先级更高

实际踩坑最多的地方,是以为改了 apache 的 php.ini 就够了,却忘了 Composer 运行在 CLI 模式下,读的是 CLI 版本的 php.ini —— 多数人根本没意识到自己有两个 php.ini。

text=ZqhQzanResources