答案是系统时间偏差过大导致https证书校验失败,需校准本地时钟:linux/macos用timedatectl启用systemd-timesyncd并重启服务,windows执行w32tm /resync并配置可靠ntp源,偏差超2分钟必须修复,临时禁用ssl验证仅限调试且不安全。

Composer 报 SSL certificate problem: certificate has expired,大概率不是证书真过期了,而是你本地系统时间偏差太大——快了或慢了超过 2 分钟,OpenSSL 校验 HTTPS 证书有效期时直接失败。
怎么确认是系统时间问题?
别急着改配置,先验证。执行:date 看当前时间,再打开浏览器访问 time.is 对比。偏差超过 120 秒(2 分钟),基本就是它了。
常见现象包括:
- 报错里明确含
certificate has expired或notBefore / notAfter相关提示 - 同一命令在别人机器上正常,在你这卡在某个 HTTPS 镜像源(比如
https://mirrors.aliyun.com/composer/) -
curl -v https://packagist.org能连通,但 Composer 就失败
Linux/macOS:用 systemd-timesyncd 快速校准
这是最轻量、最可靠的方式,不用装额外服务,也不依赖 root 权限就能启用。
执行以下命令:
sudo timedatectl set-ntp truesudo systemctl restart systemd-timesyncd
验证是否生效:timedatectl status | grep "System clock synchronized",输出 yes 即可。别跳过这步——很多 Docker 容器默认禁用 NTP,systemctl restart 后不检查等于没做。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
Windows:绕过“已同步”假象,强制重连权威 NTP 源
右下角那个“已同步”经常只是单次成功,休眠唤醒后就失效。必须手动指定稳定源并强制刷新。
以管理员身份打开命令提示符,依次运行:
-
net start w32time(如果提示服务未启动) w32tm /config /syncfromflags:manual /manualpeerlist:"time.nist.gov pool.ntp.org"w32tm /resync
完成后执行 systeminfo | find "Time Zone",和 time.is 对比,误差应 ≤ 1 秒。别信 w32tm /query /status 的“Last Successful Sync Time”,它可能几小时没更新了。
临时绕过(仅限调试,绝不长期用)
某些 CI 构建或老旧容器环境一时没法修时间,可用这个应急:
- 加环境变量:
export COMPOSER_DISABLE_TLS=1(Linux/macOS)或set COMPOSER_DISABLE_TLS=1(Windows) - 或全局禁用 SSL 验证:
composer config -g secure-http false
⚠️ 这会让所有 HTTPS 请求降级为 HTTP,中间人攻击风险拉满,只应在隔离环境、单次调试中使用。生产、CI、本地开发都不要留这个配置。
真正麻烦的不是时间不准本身,而是它常被当成网络或镜像问题去排查——花半天换源、调 timeout、清缓存,结果发现只是电脑快了 7 分钟。校准时间这一步,永远该排在所有 Composer 网络故障排查的第一位。










