根本不是证书“失效”,而是php未正确加载可信ca证书;需用php -r "print_r(openssl_get_cert_locations());"确认ini_cafile和default_cert_file有效性,同时配置curl.cainfo与openssl.cafile指向同一最新cacert.pem绝对路径,并重启终端或服务。

根本不是证书“失效”,而是 PHP 或系统没正确加载可信 CA 证书——修对 curl.cainfo 和 openssl.cafile 才能真正跑通 composer install。
怎么确认是 CA 证书路径问题,不是网络或镜像故障
别急着换镜像或清缓存,先让 PHP 自己报错:
- 运行
php -r "print_r(openssl_get_cert_locations());",重点看ini_cafile(实际生效路径)和default_cert_file(默认尝试路径)是否为空、指向不存在的文件,或文件最后修改时间早于 2022 年 - 再执行
curl -v https://packagist.org/packages.json,如果也报SSL certificate problem: unable to get local issuer certificate,说明是底层 cURL/PHP 失效,跟 Composer 配置无关 - 用
php --ini确认你正在编辑的是 CLI 模式下真正生效的php.ini(XAMPP、Homebrew、phpenv 环境常有多个)
必须同时配置 curl.cainfo 和 openssl.cafile
PHP 内部 HTTPS 请求分两路:cURL 扩展走 curl.cainfo,OpenSSL 扩展(比如 stream context)走 openssl.cafile。只设一个,另一路仍 fallback 到空信任链。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 下载最新
cacert.pem:curl -sS https://curl.se/ca/cacert.pem -o /usr/local/etc/php/cacert.pem(macOS/Linux),或curl -sS https://curl.se/ca/cacert.pem -o C:/php/extras/ssl/cacert.pem(Windows) - 在
php.ini中添加两行,路径必须是绝对路径、英文双引号包裹:curl.cainfo = "C:/php/extras/ssl/cacert.pem"openssl.cafile = "C:/php/extras/ssl/cacert.pem" - 改完保存,关闭当前终端、新开一个——CLI 下不热加载,PHP 进程必须重载上下文
系统时钟偏差也会触发“证书过期”错误
报错含 SSL certificate problem: certificate has expired,大概率不是证书真过期,而是本地时间比真实时间快或慢太多(偏差 > 2 分钟),导致 OpenSSL 校验 notBefore/notAfter 失败。
- Linux/macOS:运行
timedatectl status | grep "System clock synchronized",输出yes才算生效;否则执行sudo timedatectl set-ntp true并重启服务 - Windows:以管理员身份运行
w32tm /resync;若失败,先net start w32time,再强制指定可靠源:w32tm /config /syncfromflags:manual /manualpeerlist:"time.nist.gov pool.ntp.org" - 容器或 CI 环境里,
systemd-timesyncd常被禁用,别跳过校验步骤直接重启服务
Git 版本太低会伪装成 SSL 错误
CentOS 7 默认 Git 1.8.3、某些 Docker 镜像带旧 Git,调用 git clone 时无法支持 TLS 1.2+ 或浅克隆参数,报错看起来像 SSL certificate problem 或 unknown option `shallow-since'。
- 确认版本:
git --version,低于 2.10 就要升级 - CentOS 7 推荐用 IUS 仓库:
yum install https://repo.ius.io/ius-release-el7.rpm && yum install git222 - 升级后执行
git config --global http.sslVersion tlsv1.2,并确保PATH里新版git在前(which git要和 Composer 实际调用的一致)
最容易被忽略的是:改完 php.ini 后没关终端,或者 CLI 和 Web 加载了不同配置;还有人把 cacert.pem 放进中文路径或用了单反斜杠,导致 file_exists() 返回 false —— 这些细节卡住的人最多。










