答案是先校准系统时间再验证PHP CA证书路径;95%以上SSL报错源于本地时间偏差超2分钟或php.ini中curl.cainfo与openssl.cafile未同步指向最新cacert.pem绝对路径。

不是镜像证书真过期了,而是你本地 PHP 没加载有效的 CA 证书文件,或系统时间偏差太大——这两者占全部报错的 95% 以上。
php -r "print_r(openssl_get_cert_locations());" 看清 PHP 实际用的证书路径
别猜 default_cert_file 在哪,让 PHP 自己说。运行这条命令后,紧盯两个字段:
-
default_cert_file:PHP 默认尝试读的路径,如果为空、指向不存在的文件、或文件大小为 0(比如只有几 KB),就是病灶 -
ini_cafile:来自php.ini的显式配置,如果和default_cert_file不一致,说明配置没生效,或你改错了 php.ini
常见失效路径:/etc/ssl/certs/ca-certificates.crt(旧版 Ubuntu)、C:/php/extras/ssl/cacert.pem(XAMPP 自带的老包)、/usr/local/etc/php/8.3/openssl.cafile(Homebrew PHP 目录下压根没这个文件)
curl.cainfo 和 openssl.cafile 必须同时设、路径完全一致
Composer 底层同时用 cURL 和 OpenSSL 发起 HTTPS 请求,这两个扩展各自读一个配置项:
-
curl.cainfo控制 cURL 层(如file_get_contents、stream_context_create) -
openssl.cafile控制 OpenSSL 层(Composer 默认 HTTP 客户端底层)
只配一个?大概率仍有报错;路径写错(漏 .pem、用相对路径、Windows 单反斜杠被当转义符)?照样失败。正确做法是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 下载最新
cacert.pem(必须来自 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251) - 存到稳定绝对路径,例如:
/usr/local/etc/php/cacert.pem或C:/php/extras/ssl/cacert.pem - 在 CLI 模式真正生效的
php.ini中写两行,路径一字不差:curl.cainfo="/usr/local/etc/php/cacert.pem"openssl.cafile="/usr/local/etc/php/cacert.pem"
timedatectl status | grep "System clock synchronized" 验证时钟是否真同步
报错含 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"
偏差超 2 分钟必须修复,临时禁用 SSL 验证仅限调试且不安全。
composer config repo.packagist composer https://mirrors.aliyun.com/composer/ 尾部斜杠和 type 缺一不可
这不是“证书问题”,但会伪装成证书失败:漏写 type 或 URL 不以 / 结尾,Composer 会静默 fallback 到官方源,然后卡在 packagist.org 的 HTTPS 验证上——你以为连的是阿里云,其实连的是已被审查或证书过期的官方站。
- 错的写法:
composer config -g repo.packagist https://mirrors.aliyun.com/composer(缺type,缺结尾/) - 对的写法:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 验证是否生效:
composer config -g repo.packagist,输出必须是完整 JSON:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}
项目级更稳妥:composer config repo.packagist composer https://mirrors.aliyun.com/composer/,会自动写进 composer.json 的 repositories 字段。
最常被忽略的是:改完 php.ini 后必须关闭当前终端再新开一个,CLI 环境才重载配置;composer clear-cache 对证书路径、系统时间、元数据缓存三者完全无效。

















