根本原因是PHP未加载有效CA证书文件,需用php -r "print_r(openssl_get_cert_locations());"确认路径,下载官方cacert.pem并同步配置php.ini中openssl.cafile与curl.cainfo为同一绝对路径。

Composer install/update 报 SSL certificate problem 怎么办
直接原因是 OpenSSL 无法验证 Packagist 或 GitHub 的 HTTPS 证书链,常见于企业代理、老旧系统或自定义 CA 环境。不是 Composer 本身问题,而是底层 cURL + OpenSSL 的握手失败。
典型错误信息:SSL certificate problem: unable to get local issuer certificate 或 cURL error 60: SSL certificate problem。
- 先确认是否真为证书问题:运行
curl -I https://packagist.org/packages.json,看是否同样报错 —— 如果也失败,说明是系统级 TLS 配置问题,不是 Composer 特有 - 别急着关 SSL 验证(
composer config -g secure-http false),这会降级所有包源为 HTTP,存在中间人风险 - 优先检查
openssl version -a和php -r "print_r(openssl_get_cert_locations());",确认 PHP 使用的 CA 包路径是否可读、是否过期
怎么让 Composer 信任自定义 CA 或企业根证书
Composer 默认复用 PHP 的 OpenSSL 配置,不读取系统 /etc/ssl/certs 或 Windows 证书存储。必须显式指定 CA bundle 路径。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 下载最新 Mozilla CA bundle:用
curl -sS https://curl.se/ca/cacert.pem -o /usr/local/share/ca-bundle.crt(Linux/macOS)或存到 Windows 可读路径如C:\certs\cacert.pem - 告诉 Composer 使用它:执行
composer config -g cafile /usr/local/share/ca-bundle.crt - 如果 PHP 运行在容器或受限环境,确保该文件路径对 PHP 进程可读(注意 SELinux 或挂载权限)
- 验证是否生效:运行
composer config -g cafile看输出,再试composer diagnose,应不再报 SSL 错误
为什么设置 CURLOPT_SSL_VERIFYPEER=false 不推荐
有人在 php.ini 里加 curl.cainfo=/path/to/cacert.pem 没用,就干脆禁用证书验证 —— 这会让所有 HTTPS 请求跳过证书校验,包括下载的 zip 包、远程仓库元数据。
-
composer config -g secure-http false只影响源协议(强制走 HTTPS),不解决握手失败;真正禁用校验的是改 PHP 的openssl.cafile或 cURL 的CURLOPT_SSL_VERIFYPEER - 一旦关闭,攻击者可在你 fetch
composer.lock依赖时注入恶意包(例如劫持 packagist.org 域名或污染 DNS) - 某些 CI 环境(如 GitLab Runner)默认禁用 SSL 校验,需在
.gitlab-ci.yml中显式恢复:用before_script设置COMPOSER_CAFILE环境变量
Windows 下 Composer 使用系统证书失败的常见原因
PHP for Windows 默认不读 Windows 证书存储,即使浏览器能打开 https://packagist.org,Composer 仍可能失败。
- 不要依赖
php_openssl.dll自动加载系统根证书 —— 它只认 PEM 格式 CA bundle - 推荐做法:下载
cacert.pem,然后在php.ini中写明openssl.cafile="C:\php\extras\ssl\cacert.pem"(路径用双引号包裹,反斜杠不转义) - 重启 Web 服务或 CLI PHP 进程后,用
php -i | findstr "cafile"确认生效 - 若公司使用 ZScaler、Netskope 等 TLS 解密代理,需单独导出其根证书为 PEM,并加入该 bundle 文件末尾
最麻烦的情况是 CA bundle 路径正确、文件可读,但 PHP 进程仍报错 —— 很可能是 OpenSSL 版本太老(

















