该错误表明PHP OpenSSL证书验证失败,主因是根证书过期或缺失、系统时间偏差过大;需执行php -r "print_r(openssl_get_cert_locations());"定位default_cert_file路径,下载https://curl.se/ca/cacert.pem覆盖原证书,并校准系统时间后重启服务。

报错含“SSL3_GET_SERVER_CERTIFICATE”或“certificate verify failed”
这说明 PHP 的 OpenSSL 扩展在验证 HTTPS 证书时失败,不是 Composer 配置错了,而是底层 SSL 根证书不可用或系统时间偏差过大。典型错误如:SSL operation failed with code 1、SSL3_GET_SERVER_CERTIFICATE:certificate verify failed,常出现在访问阿里云镜像(https://mirrors.aliyun.com/composer/)时。
先查 PHP 正在用哪个证书文件
执行这条命令看实际加载路径:php -r "print_r(openssl_get_cert_locations());"。重点关注输出里的 default_cert_file 和 ini_cafile 字段,比如常见值是 /etc/pki/tls/cert.pem 或 /usr/lib/ssl/certs/ca-certificates.crt。这个路径就是你要修复的目标。
证书文件损坏或过期?直接换新
别修旧文件,直接下载权威根证书集合覆盖:
- 运行
wget --no-check-certificate https://curl.se/ca/cacert.pem -O /tmp/cacert.pem(--no-check-certificate是因为当前环境已无法校验) - 备份原证书:
sudo cp $(php -r "print_r(openssl_get_cert_locations());" | grep default_cert_file | awk -F'=> ' '{print $2}' | tr -d " \n\"") /tmp/cert.pem.bak - 覆盖写入:
sudo cp /tmp/cacert.pem $(php -r "print_r(openssl_get_cert_locations());" | grep default_cert_file | awk -F'=> ' '{print $2}' | tr -d " \n\"") - 确保权限正确:
sudo chmod 644 $(php -r "print_r(openssl_get_cert_locations());" | grep default_cert_file | awk -F'=> ' '{print $2}' | tr -d " \n\"")
系统时间不准也会触发证书失效
SSL 证书有明确有效期,若本地时间比真实时间快几小时或慢几天,就会被判定“不在有效期内”。运行 date 看当前时间,再对比 time.is。若偏差 > 2 分钟:
- Linux:运行
sudo timedatectl set-ntp true启用 NTP 同步 - macOS:系统设置 → 通用 → 日期与时间 → 勾选“自动设置日期与时间”
- Docker 容器内:启动时加
--network=host或挂载宿主机时间:-v /etc/localtime:/etc/localtime:ro
时间校准后必须重启终端或 PHP 进程,否则 OpenSSL 缓存仍会沿用旧时间判断。











