根本原因是PHP未加载有效CA证书或系统时间偏差超2分钟,需运行php -r "print_r(openssl_get_cert_locations());"确认default_cert_file和ini_cafile路径有效性,并同步配置openssl.cafile与curl.cainfo指向同一最新cacert.pem,同时校准系统时间。

不是证书真过期,是 PHP 没读到有效的 CA 证书文件,或系统时间偏差超 2 分钟 —— 修错地方只会反复报错。
怎么看 PHP 实际在用哪个证书文件
别猜路径,让 PHP 自己说。运行:php -r "print_r(openssl_get_cert_locations());",重点盯两个值:
-
default_cert_file:PHP 默认尝试加载的路径,如果为空、指向不存在的文件、或最后修改时间早于 2022 年,就是问题源头 -
ini_cafile:来自php.ini的显式配置,如果和default_cert_file不一致,说明你改的php.ini没生效(常见于多版本 PHP 或 Docker 里加载了错误的 ini) - 同时检查
curl.cainfo:用php --ini找到真实生效的php.ini,搜curl.cainfo,它必须和openssl.cafile指向同一绝对路径
怎么换证书:只下官方 cacert.pem,且 openssl.cafile 和 curl.cainfo 必须一致
XAMPP/WAMP/phpEnv 自带的 curl-ca-bundle.crt 多数停更于 2021 年,无法验证 ISRG Root X1/X2 —— 别用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 下载地址必须是 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251(不要浏览器另存,避免 HTML 包裹)
- Linux/macOS 示例路径:
/usr/local/etc/php/cacert.pem;Windows 示例路径:C:/php/extras/ssl/cacert.pem(单反斜杠会转义,写成正斜杠或双反斜杠) - 在
php.ini中**同时写两行**,路径完全一致、英文双引号包裹:openssl.cafile="/usr/local/etc/php/cacert.pem"curl.cainfo="/usr/local/etc/php/cacert.pem" - 改完必须重启:CLI 模式关掉当前终端、新开一个;Web 模式(Apache/Nginx)必须
sudo apachectl restart或sudo systemctl restart php-fpm,reload 不生效
怎么确认是不是系统时间导致的“证书过期”
OpenSSL 校验证书时严格比对 notBefore/notAfter 和本地系统时间,快或慢超过 2 分钟就直接报 certificate has expired。
- 快速验证:运行
date,再打开 https://www.php.cn/link/36e8f60329e363b43f2a1260a113457d 对比,偏差 > 120 秒基本就是它 - Linux/macOS:执行
sudo timedatectl set-ntp true && sudo systemctl restart systemd-timesyncd,再用timedatectl status | grep "System clock synchronized"确认输出yes - Windows:管理员运行命令提示符,依次执行:
net start w32time→w32tm /config /syncfromflags:manual /manualpeerlist:"time.nist.gov pool.ntp.org"→w32tm /resync - 容器环境:宿主机时间不准会直接带偏容器,先修宿主机;Alpine 镜像需额外安装
openntpd或挂载/etc/timezone
镜像配置错误会掩盖真实证书问题
很多“证书失败”其实是 Composer 根本没走你设的镜像,默默退回 packagist.org 后被拦截。
- 验证是否真用了镜像:
composer config -g repo.packagist,输出必须是完整 JSON,例如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};空、null或仍是https://packagist.org就说明配置失败 - 项目级
composer.json里只要存在"repositories"字段(哪怕只是[]),全局配置就完全失效 - URL 必须以
/结尾:https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌ - 手动测试镜像连通性:
curl -I https://mirrors.aliyun.com/composer/packages.json,返回HTTP/2 200且无 SSL 报错,说明镜像端正常,问题一定在本地
最常被忽略的是:改完 php.ini 后没重启 CLI 终端,或 Web 服务只 reload 没 restart —— 这时候所有操作都白做。

















