根本原因是本地php的openssl.cafile或curl.cainfo指向过期、损坏或不存在的证书文件,导致无法验证镜像站合法https证书;应下载最新cacert.pem,同时在php.ini中配置二者为同一绝对路径并重启环境。

为什么中文镜像配置后突然报自签名证书错误
不是镜像本身用了自签名证书,而是你本地 PHP 的 openssl.cafile 或 curl.cainfo 指向了一个过期、损坏或根本不存在的证书文件,导致 Composer 在验证阿里云/腾讯云等镜像站的合法 HTTPS 证书时失败。典型报错是 cURL error 60: SSL certificate problem: unable to get local issuer certificate —— 这说明 PHP 根本没加载到能验证现代根证书(如 ISRG Root X1)的 CA 包。
确认 PHP 实际用的证书路径是否有效
别猜路径,让 PHP 自己说:
php -r "print_r(openssl_get_cert_locations());"
重点看这两项:
-
default_cert_file:PHP 默认尝试读的路径,为空或指向一个 ≤10KB 的文件,基本等于没证书 -
ini_cafile:来自php.ini的显式配置,若显示no value,说明你根本没配
再补一刀验证:
curl -v https://mirrors.aliyun.com/composer/ 2>&1 | grep "SSL certificate"
如果也报错,问题 100% 出在本地证书配置,跟镜像地址、DNS、代理全无关。
Windows 和 macOS 下最常踩的坑
Windows 用户尤其容易被 XAMPP/WAMP 坑:它们自带的 curl-ca-bundle.crt 多数停更于 2021 年,文件存在但内容不含 ISRG Root X1,PHP 读得进去却验不过。
macOS Homebrew PHP 默认不设 openssl.cafile,也不会自动用系统钥匙串——它只认自己配置的路径。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
必须同时配齐两行,且路径完全一致:
openssl.cafile="/usr/local/etc/php/cacert.pem"curl.cainfo="/usr/local/etc/php/cacert.pem"
路径要用正斜杠、绝对路径、英文双引号包裹;Windows 上写成 C:/php/extras/ssl/cacert.pem,别用单反斜杠(C:\php\... 是转义错误)。
下载并替换证书文件的实操步骤
去官方源下载最新权威 CA 包:
curl -sS https://curl.se/ca/cacert.pem -o /usr/local/etc/php/cacert.pem
Linux/macOS 推荐放 /usr/local/etc/php/cacert.pem;Windows 建议手动创建目录 C:/php/extras/ssl/ 再存入。
改完 php.ini 后:
- CLI 模式:必须关掉当前终端,新开一个(重开命令行才生效)
- Web 模式(Apache/Nginx):必须完整重启服务,
reload不管用 - IDE 内置终端(如 PHPStorm):可能缓存旧配置,需重启 IDE 或检查其 PHP 解释器路径
验证是否生效:php -i | grep "openssl.cafile" 应输出你刚写的路径,且 file /usr/local/etc/php/cacert.pem 显示大小 ≥200KB。
真正起作用的是 PHP 层级的 openssl.cafile,不是 Composer 的 cafile 配置,也不是环境变量。很多人花时间调 Composer 参数,却漏了 php.ini 里那一行——证书链断在哪,就得修在哪。










