根本原因是PHP的openssl.cafile和curl.cainfo未正确配置为同一绝对路径的最新cacert.pem文件,需通过php -r "print_r(openssl_get_cert_locations());"和curl -v验证路径有效性并重启服务。

直接原因是本地 PHP 的 OpenSSL 或 cURL 扩展加载的 CA 证书文件过期或路径失效,无法验证阿里云、腾讯云等镜像站的 HTTPS 证书链;修复必须落在 php.ini 的 openssl.cafile 和 curl.cainfo 配置上,而非换镜像或关 SSL 验证。
确认 PHP 实际加载的证书路径
别猜、别试错,让 PHP 自己告诉你它在用哪个证书文件:
- 运行
php -r "print_r(openssl_get_cert_locations());" - 重点看
default_cert_file(PHP 默认尝试读的路径)和ini_cafile(来自php.ini的显式配置) - 如果
default_cert_file为空、指向不存在的文件、或文件最后修改时间早于 2022 年,基本就是根因 - Windows 常见失效路径:
C:phpEnvphpextrassslcacert.pem;Linux/macOS 常见路径:/etc/ssl/certs/ca-certificates.crt或/usr/local/etc/openssl/cert.pem
下载并统一配置最新 cacert.pem
必须用 curl.se 官方维护的证书包,XAMPP/WAMP/phpEnv 自带的 curl-ca-bundle.crt 多数停更于 2021 年,无法验证 ISRG Root X1 证书:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 下载最新证书:
curl -sS https://curl.se/ca/cacert.pem -o /usr/local/etc/php/cacert.pem(Linux/macOS)或curl -sS https://curl.se/ca/cacert.pem -o C:/phpEnv/php/extras/ssl/cacert.pem(Windows) - 在
php.ini中同时设置两行,路径必须完全一致、用正斜杠或双反斜杠、绝对路径、英文双引号包裹:openssl.cafile="/usr/local/etc/php/cacert.pem"curl.cainfo="/usr/local/etc/php/cacert.pem" - Windows 路径中单反斜杠
是转义符,写成C:\phpEnv\php\extras\ssl\cacert.pem或C:/phpEnv/php/extras/ssl/cacert.pem - 改完后,CLI 模式需关闭终端重开;Web 模式(Apache/Nginx)必须重启整个服务,仅重载配置无效
验证镜像源是否真的可用,而非证书问题
有些报错看着像证书过期,实则是镜像本身不可用或 DNS 解析异常:
- 运行
curl -I https://mirrors.aliyun.com/composer/,若返回HTTP/2 200且无证书警告,说明镜像端正常,问题一定在本地证书或 PHP 配置 - 检查当前全局镜像配置:
composer config -g repo.packagist,输出应为https://mirrors.aliyun.com/composer/(注意是 HTTPS,阿里云已停用 HTTP) - 若输出为空或仍是
https://packagist.org,说明没切镜像,先执行:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 换源后务必清缓存:
composer clear-cache,否则旧包路径仍会尝试走原地址
为什么 composer config -g cafile 或 secure-http false 基本无效
这些命令不作用于底层 HTTPS 握手环节,属于典型“治标不治本”:
-
composer config -g cafile只影响 Composer 自封装的 HTTP 客户端(如 php-http 驱动),而实际触发cURL error 60或certificate verify failed的是 PHP 的 cURL/OpnSSL 扩展,它们完全不读该配置 -
composer config -g secure-http false不是跳过证书验证,只是允许非 HTTPS 源;Packagist 自 2022 年起强制 HTTPS,设了这个反而会让composer install直接退出 -
--disable-tls是调试专用,启用后所有包走 HTTP 明文,存在中间人劫持风险,CI/CD 环境中误提交会导致安全审计失败 - 真正起效的只有
php.ini中的openssl.cafile和curl.cainfo,且二者必须同时设、路径完全一致
最容易被忽略的是:PHP CLI 和 Web SAPI 可能加载不同的 php.ini,尤其在 phpEnv、Docker 或多版本 PHP 环境中;务必用 php --ini 确认你编辑的是 CLI 模式下真正生效的那个文件。

















