ssl证书验证失败(如error:14090086)是ca信任链断裂所致,非网络问题;根本解决需更新系统ca-certificates包、升级certifi或正确配置openssl.cafile指向有效根证书文件,禁用验证仅限调试且不安全。

SSL certificate verify failed 是证书链校验失败,不是网络不通
看到 SSL operation failed with code 1 或 error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed,说明 PHP 的 OpenSSL 扩展在建立 HTTPS 连接时,无法验证远程服务器(如 packagist.org 或 mirrors.aliyun.com)返回的证书——这和 DNS、代理、超时都无关,是证书信任链断了。
先验证是不是底层问题:curl -I https://packagist.org 如果也报同样的 SSL 错误,那一定是系统或 PHP 的 CA 证书库失效,Composer 只是“受害者”。
- CentOS/RHEL 系统常因
ca-certificates包过旧(尤其 7.x 默认带的是 2018 年的根证书)导致无法验证新签发的 Let’s Encrypt 证书 - PHP 编译时未链接系统 OpenSSL,或
php.ini中openssl.cafile指向了一个空/损坏的 PEM 文件 - 某些国产杀毒软件或企业防火墙会劫持 HTTPS 流量并注入自签名证书,但没把它的根证书导入系统信任库
确认并修复 PHP 使用的 CA 证书路径
运行 php -r "print_r(openssl_get_cert_locations());",重点关注 default_cert_file 和 ini_cafile 输出的路径(例如 /etc/pki/tls/cert.pem)。这个文件就是 PHP 当前用来校验证书的“信任锚”。
如果该路径不存在、为空,或最后修改时间早于 2023 年,就得换掉它:
- 下载最新权威根证书:用
wget --no-check-certificate https://curl.se/ca/cacert.pem -O /tmp/cacert.pem(--no-check-certificate是因为当前环境本身已不信任 curl.se) - 备份原文件:
sudo cp /etc/pki/tls/cert.pem /etc/pki/tls/cert.pem.bak - 覆盖写入:
sudo cp /tmp/cacert.pem /etc/pki/tls/cert.pem - 确保权限正确:
sudo chmod 644 /etc/pki/tls/cert.pem
改完后必须重启 CLI 环境(关掉终端重开),再执行 php -r "var_dump(openssl_x509_parse(file_get_contents('/etc/pki/tls/cert.pem')));" 看是否能正常解析——能解析才说明文件格式有效。
别乱用 --no-secure-http,它不解决证书错误
composer install --no-secure-http 或 composer config -g secure-http false 只是告诉 Composer “允许从 HTTP 源拉包”,但它完全不干预底层 SSL 证书校验。一旦你连的是 HTTPS 镜像(比如 https://mirrors.aliyun.com/composer/),这个开关就毫无作用。
真正能绕过证书校验的,只有两类方式(仅限调试):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 临时设环境变量:
COMPOSER_NO_SSL=1 composer install(Linux/macOS)或set COMPOSER_NO_SSL=1 && composer install(Windows CMD) - 强制指定 PHP 的 CA 路径:
php -d openssl.cafile=/tmp/cacert.pem composer.phar install
⚠️ 这两种都是降级安全性的应急手段,不能用于 CI/CD 或生产部署。它们掩盖了证书配置缺陷,下次换机器或重装 PHP 还会复现。
镜像源 URL 少斜杠、type 写错,会导致证书错误假象
看似在用 HTTPS 镜像,其实 Composer 根本没走过去——因为配置无效,它 fallback 到了默认的 https://packagist.org,而你的本地证书又刚好不认它,于是报错。
检查镜像是否真生效:composer config -g repo.packagist 输出必须是完整 JSON,例如:
{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}
常见配置陷阱:
-
url值末尾漏了/:写成"https://mirrors.aliyun.com/composer"→ 拼出的请求地址变成https://mirrors.aliyun.com/composerpackages.json,404 后可能触发异常回退逻辑,间接引发 SSL 异常 -
type写成compose或composer-repo→ 配置被忽略,静默 fallback - 用了
repos(复数)键名,正确应为repo.packagist(单数 + 点号)
配完务必执行 composer clear-cache,否则旧缓存里仍存着 packagist.org 的失败响应,会干扰判断。
最易被忽略的一点:系统时间偏差超过 5 分钟,SSL 证书的 notBefore/notAfter 时间范围就会校验失败——连 date 都不看一眼,直接报 certificate verify failed。










