换镜像后仍报ssl certificate problem,根本原因是本地php的openssl.cafile和curl.cainfo未正确配置为同一绝对路径的最新cacert.pem文件,导致无法验证isrg root x1等新根证书;需运行php -r "print_r(openssl_get_cert_locations());"确认路径,下载官方证书并统一配置,重启环境后验证。

为什么换镜像后还报 SSL certificate problem?
不是镜像本身的问题,是本地 PHP 的 OpenSSL 或 cURL 没法验证镜像站的 HTTPS 证书链。阿里云、腾讯云等镜像都用 ISRG Root X1(Let’s Encrypt 新根证书),而很多旧版 PHP 自带的 cacert.pem 停更于 2021 年,压根不认识它。
常见错误信息包括:SSL certificate problem: unable to get local issuer certificate、curl error 60、SSL3_GET_SERVER_CERTIFICATE。这些都指向同一个地方:PHP 加载的 CA 证书文件过期或路径错。
- 别改镜像 URL 或加
--no-ssl—— 这只是掩盖问题,且disable-tls true在 Composer 2.2+ 已被拒绝 - 别用 XAMPP/WAMP 自带的
curl-ca-bundle.crt—— 它基本都不更新了 - 必须统一配置
openssl.cafile和curl.cainfo,且指向同一份最新证书文件
怎么确认 PHP 当前在用哪个 CA 证书文件?
不猜、不翻 php.ini、不看文档,直接问 PHP:
php -r "print_r(openssl_get_cert_locations());"
重点看这两项:
-
default_cert_file:PHP 默认尝试读的路径,如果为空、不存在、或修改时间早于 2022 年,基本就是根因 -
ini_cafile:来自 php.ini 的显式配置,如果没设,就 fallback 到default_cert_file
Windows 常见失效路径:C:/phpEnv/php/extras/ssl/cacert.pem;Linux/macOS 常见路径:/etc/ssl/certs/ca-certificates.crt 或 /usr/local/etc/openssl/cert.pem。
如何下载并正确配置最新 cacert.pem?
必须用 curl.se 官方维护的证书包,地址是:https://curl.se/ca/cacert.pem。
下载命令(按系统选):
- Linux/macOS:
curl -sS https://curl.se/ca/cacert.pem -o /usr/local/etc/php/cacert.pem - Windows(PowerShell):
curl.exe -sS https://curl.se/ca/cacert.pem -o "C:/phpEnv/php/extras/ssl/cacert.pem"
然后在 php.ini 中同时写两行,路径**必须完全一致**,用正斜杠或双反斜杠,绝对路径,英文双引号包裹:
openssl.cafile="/usr/local/etc/php/cacert.pem" curl.cainfo="/usr/local/etc/php/cacert.pem"
改完后:
- CLI 模式:关掉终端重开(环境变量和配置缓存不会自动刷新)
- Web 模式(Apache/Nginx):必须重启整个服务,仅 reload 配置无效
验证是否真解决了 SSL 报错?
别只跑 composer install 看有没有错——它可能 fallback 到官方源静默失败。
分三步验证:
- 确认镜像已生效:
composer config -g repo.packagist,输出必须是完整 JSON:{"type":"composer","url":"https://mirrors.aliyun.com/composer/"} - 确认证书路径有效:
curl -v https://mirrors.aliyun.com/composer/packages.json 2>&1 | grep "SSL connection",看到SSL connection using TLSv1.3才算通 - 触发真实请求:
composer clear-cache && composer require monolog/monolog -vvv --no-ansi 2>&1 | grep -i "ssl\|curl error\|GET",看到GET https://mirrors.aliyun.com/composer/...且无curl error 60才算闭环
最常被忽略的是:改了 php.ini 却没重启 Web 服务,或者 Windows 下没关终端,导致 CLI 和 Web 模式用的还是旧证书路径。











