根本原因是PHP的OpenSSL扩展未正确加载或ca-bundle路径配置错误;需检查php.ini中openssl.cafile指向有效PEM文件,推荐使用Mozilla官方CA包并验证路径生效。

Composer 下载包时遇到 SSL certificate verify failed 错误,根本原因不是证书过期,而是 PHP 的 OpenSSL 扩展没正确加载或 ca-bundle 路径不对——90% 的情况改 openssl.cafile 就能解决。
PHP 的 openssl.cafile 配置没生效
Composer 依赖 PHP 自身的 OpenSSL 验证机制,不是自己管证书。如果 php.ini 里 openssl.cafile 指向了一个不存在、权限不对或格式错误的 PEM 文件,就会报错,哪怕系统级证书是好的。
- 运行
php --ini确认正在用哪个php.ini - 检查该文件中是否有
openssl.cafile = "/path/to/cacert.pem",路径必须绝对且可读 - 推荐用 Mozilla 官方维护的 CA 包:
curl -sS https://curl.se/ca/cacert.pem -o /usr/local/etc/php/cacert.pem(macOS Homebrew)或C:\php\cacert.pem(Windows) - 改完重启 Web 服务或 CLI 环境,用
php -r "print_r(openssl_get_cert_locations());"验证路径是否被识别
Composer 自带的 CA 包被绕过或失效
Composer v2.2+ 默认启用 cafile 自动探测,但某些环境(如 Docker 容器、CI 环境)可能因缺少系统证书或挂载问题导致 fallback 失败。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 临时跳过验证(仅调试):
composer config -g secure-http false—— 不推荐长期用,会降级到 HTTP,有安全风险 - 强制指定 CA 文件:
composer config -g cafile /path/to/cacert.pem,这个值会覆盖 PHP 的openssl.cafile - 注意:如果同时设置了 PHP 和 Composer 两级 cafile,Composer 优先用自己的
- CI 场景下建议在构建前预下载并固定 cafile 路径,避免每次拉取上游不稳定
Windows 上 OpenSSL DLL 加载失败导致证书链无法验证
Windows 用户常见现象是报错里带 SSL operation failed with code 1 或直接提示 “unable to get local issuer certificate”,本质是 PHP 找不到 libssl-1_1.dll 或版本不匹配。
- 检查
php -m | findstr openssl是否输出了openssl—— 没有就说明扩展没加载 - 确认
php.ini中extension=openssl已取消注释,且extension_dir指向正确的 DLL 目录(如C:\php\ext) - 把 PHP 安装目录下的
libcrypto-1_1.dll和libssl-1_1.dll复制到C:\Windows\System32(64 位系统用System32,32 位用SysWOW64) - 别用从不同来源混搭的 PHP + OpenSSL DLL,比如 XAMPP 的 PHP 配 OpenWrt 编译的 DLL,极易出错
真正麻烦的不是找不到证书,而是错误堆栈里不告诉你到底卡在哪一层:PHP 扩展?Composer 配置?还是系统环境变量污染了 SSL_CERT_FILE?动手前先跑一遍 php -r "var_dump(openssl_get_cert_locations());" 和 composer config -g cafile,比盲目搜解决方案快得多。

















