解决Composer连接Packagist时的SSL/TLS证书错误

12次阅读

composer报错curl Error 60或ssl certificate problem的根本原因是php未正确配置openssl.cafile指向可信CA证书包,需下载cacert.pem并配置php.ini中openssl.cafile路径,重启环境后验证。

解决Composer连接Packagist时的SSL/TLS证书错误

Composer install/update 报错 cURL error 60 或 SSL certificate problem

这是最典型的症状,错误信息里通常包含 cURL error 60SSL certificate problem: unable to get local issuer certificatePeer's Certificate issuer is not recognized。根本原因是 Composer(底层用 cURL)无法验证 Packagist(https://packagist.org)的 TLS 证书链,常见于 windows 环境或自定义 PHP 环境(如 WAMP/XAMPP),因为 PHP 没有正确加载 CA 证书包。

检查并设置 PHP 的 openssl.cafile 配置项

Composer 依赖 PHP 的 OpenSSL 扩展发起 https 请求,而该扩展需要知道从哪读取可信根证书。关键配置是 openssl.cafile,不是 curl.cainfo(后者只影响 curl 扩展本身,Composer 不直接用它)。

  • 运行 php --ini 查看当前生效的 php.ini 路径
  • 编辑该 php.ini,取消注释或新增一行:
    openssl.cafile="C:/path/to/cacert.pem"
  • 证书文件可从 Mozilla 官方获取:https://curl.se/ca/cacert.pem,下载后保存为本地路径(注意用正斜杠或双反斜杠,如 C:/php/cacert.pem
  • 改完重启 Web 服务或 CLI 环境,再运行 php -r "print_r(openssl_get_cert_locations());" 确认 default_cert_file 已更新

临时绕过验证(仅限调试,禁止生产环境)

不推荐长期使用,但能快速验证是否为证书问题本身:

  • 在项目根目录运行:
    composer config -g secure-http false

    (禁用所有 HTTPS 强制要求,风险高)

  • 或临时指定 HTTP 源(同样不安全):
    composer config -g repo.packagist composer https://packagist.org

    → 改为

    composer config -g repo.packagist composer http://packagist.org
  • 更可控的方式是仅对当前命令跳过验证:
    composer install -vvv --no-plugins --no-scripts

    结合环境变量(linux/macOS):

    export COMPOSER_NO_SSL=1 && composer install

    ;Windows:

    set COMPOSER_NO_SSL=1 && composer install

Windows 上 XAMPP/WAMP 用户的典型陷阱

这类集成环境常自带旧版 PHP 和孤立的 php.ini,容易忽略两个关键点:

  • CLI 和 apache 使用的是两套 php.ini:运行 php --ini 和访问 phpinfo() 页面确认路径是否一致
  • 证书路径不能含中文、空格或长路径名;推荐放在简单路径如 C:/php/cacert.pem,并在 php.ini 中写死绝对路径
  • 某些杀毒软件(如 Avast、McAfee)会劫持 HTTPS 流量并注入自己的根证书,导致系统级证书信任链异常——可尝试临时关闭实时防护测试

证书配置一旦生效,composer diagnose 应显示 HTTPS connection to packagist.org: OK。如果仍失败,大概率是网络中间设备(企业代理、防火墙)干扰,而非单纯证书问题。

text=ZqhQzanResources