结论是证书验证失败非Composer本身问题,主因是系统时间偏差超2分钟、CA证书缺失或PHP OpenSSL扩展未启用;需依次检查校准时间、配置curl.cainfo与openssl.cafile指向有效cacert.pem、确认OpenSSL已启用。

直接说结论:证书验证失败不是 Composer 本身的问题,composer install 报错时别急着删配置或换镜像,先确认是系统时间偏差、CA 证书缺失,还是 PHP OpenSSL 扩展没启用——这三类原因占了 90% 以上。
检查系统时间是否偏差过大
“SSL certificate problem: certificate has expired” 这类报错,八成是本地时间快了或慢了超过 2 分钟。OpenSSL 校验证书 notBefore/notAfter 时间戳,哪怕只差 90 秒也会失败。
- Linux/macOS:运行
timedatectl status,看System clock synchronized是否为yes;若否,执行sudo timedatectl set-ntp true并sudo systemctl restart systemd-timesyncd - Windows:管理员命令行运行
w32tm /resync;若失败,先net start w32time,再指定源w32tm /config /syncfromflags:manual /manualpeerlist:"time.nist.gov" - 容器或 CI 环境里 NTP 不可用?别硬改时间,优先用
composer install --no-secure-http应急,但必须同步修复时间源
确认 PHP 的 CA 证书路径是否有效
错误信息含 unable to get local issuer certificate 或 certificate verify failed,大概率是 openssl.cafile 或 curl.cainfo 指向了一个空、损坏或过期的证书文件。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先查真实路径:
php -r "print_r(openssl_get_cert_locations());",重点关注default_cert_file和ini_cafile - 如果路径指向
/etc/pki/tls/cert.pem(CentOS)或/private/etc/ssl/cert.pem(macOS),检查该文件是否可读、是否包含 2022 年后签发的根证书(如 ISRG Root X1) - Windows 用户常见问题:PHP ZIP 包自带证书已过期,必须手动下载最新
cacert.pem(推荐从 curl.se 获取),然后在php.ini中明确设置:openssl.cafile="C:/php/extras/ssl/cacert.pem"curl.cainfo="C:/php/extras/ssl/cacert.pem" - 改完
php.ini后,CLI 模式需新开终端,Web 服务必须完整重启(reload不生效)
临时关闭 SSL 验证仅限调试,且要分清开关作用
--no-secure-http 和 disable-tls true 完全不是一回事,混用反而让问题更难定位。
-
composer install --no-secure-http:只禁用对仓库 URL 协议的强制 HTTPS 检查(即允许http://源),**不绕过证书校验**;适用于镜像源配置成http但被拦截的场景 -
composer config -g disable-tls true:真正关闭 TLS 加密层,所有请求退化为明文 HTTP —— **极度危险,仅限离线内网调试** -
COMPOSER_NO_SSL=1环境变量:底层调用 cURL 时设CURLOPT_SSL_VERIFYPEER=0,跳过证书验证,但依然走 HTTPS;比disable-tls稍安全,但仍不可用于生产 - 注意:
secure-http false是全局配置,影响后续所有命令,应急时优先用单次--no-secure-http,避免污染环境
镜像源配置错误会掩盖真实问题
很多人一出错就换镜像,结果发现阿里云、腾讯云镜像也报同样错误——那说明根本不是网络或镜像问题,而是本地证书或时间没修好。
- 先验证官方源是否可达:
curl -I https://packagist.org/packages.json 2>/dev/null | head -n1,返回HTTP/2 200才算底层 HTTPS 正常 - 检查当前镜像:
composer config -g repo.packagist,如果输出含packagist.phpcomposer.com这种已下线域名,立刻删掉:composer config -g --unset repos.packagist - 确认要用新镜像,务必等证书和时间都 OK 后再配:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - GPG 签名验证失败(
Signature verification failed)?那是 Composer 2.2+ 的新机制,必须系统时间偏差
最易被忽略的一点:很多开发者修完证书路径、切了镜像,却忘了 composer clear-cache。缓存里可能存着上次失败时下载的半截 packages.json,它自带无效签名或过期时间戳,不清理就会反复触发相同错误。

















