先运行php -r "print_r(openssl_get_cert_locations());"确认default_cert_file和ini_cafile是否为空、路径不存在或文件≤10kb;再执行curl -v https://your-private-repo.example.com/packages.json,若同样报ssl certificate problem,则锁定为本地tls环境问题,需配置openssl.cafile指向有效私有ca根证书。

怎么确认是自建源证书问题,不是网络或配置错误
别直接改 composer.json 或清缓存,先让 PHP 自己说话:运行 php -r "print_r(openssl_get_cert_locations());",盯住 default_cert_file 和 ini_cafile。如果这两个值为空、路径不存在、或对应文件大小 ≤ 10KB,说明 PHP 根本没加载有效 CA 证书——你连验证自建源证书的“尺子”都没有,更别说判断它对不对了。
再补一刀:curl -v https://your-private-repo.example.com/packages.json。如果也报 SSL certificate problem: unable to get local issuer certificate,那问题就锁死在本地 TLS 环境,和 Composer 配置、镜像地址、甚至 DNS 全都无关。
自建源用私有 CA 时必须配 openssl.cafile,不能只靠 composer config
composer config -g cafile 只影响 Composer 自己封装的 HTTP 客户端(比如元数据请求),但 Git 克隆依赖、插件调用、甚至某些重定向跳转,都会绕过它,直接走 PHP 底层 OpenSSL。一旦你的自建源证书是用内部 CA 签发的,就必须让 PHP 知道该信谁。
- 下载你的私有 CA 根证书(PEM 格式),存为绝对路径,例如
/opt/myca/root-ca.pem - 编辑 CLI 模式生效的
php.ini(先跑php --ini确认路径),加一行:openssl.cafile = "/opt/myca/root-ca.pem" - 重启终端(CLI 模式不关旧窗口,新配置不生效);Web 环境需重启 Apache/Nginx 或 PHP-FPM
自建源用 Let's Encrypt 证书却仍失败?检查系统时间与 OCSP stapling
Let’s Encrypt 证书本身没问题,但握手失败常因两个隐形坑:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 服务器系统时间偏差 > 5 分钟:OpenSSL 会直接拒绝证书,报错类似
SSL3_GET_SERVER_CERTIFICATE:certificate verify failed。用date对比 NTP 时间,必要时执行sudo ntpdate -s time.nist.gov - 自建源启用了 OCSP stapling,但后端 Web 服务器(如 Nginx)未正确配置 stapling responder 或证书链不全:用
openssl s_client -connect your-private-repo.example.com:443 -status -servername your-private-repo.example.com查看输出里是否有OCSP response: no response sent或Verify return code: 21 (unable to verify the first certificate)
后者需确保 Nginx 的 ssl_certificate 指向包含完整链的 PEM(即域名证书 + 中间 CA),而非仅域名证书。
Windows 下 WAMP/XAMPP 用户的典型陷阱
WAMP/XAMPP 自带的 PHP 常把 openssl.cafile 指向一个早已失效的路径,比如 C:\wamp64\bin\php\php8.2.12\extras\ssl\cacert.pem,而这个文件要么不存在,要么是 2021 年的老版本,连 ISRG Root X1 都没有。
- 手动创建目录:
mkdir C:\php\extras\ssl - 下载最新根证书:
curl -sS https://curl.se/ca/cacert.pem -o C:\php\extras\ssl\cacert.pem - 编辑
php.ini(CLI 和 Web 可能不同份,php --ini和phpinfo()各查一次),写两行(路径用正斜杠、带双引号):curl.cainfo = "C:/php/extras/ssl/cacert.pem"<br>openssl.cafile = "C:/php/extras/ssl/cacert.pem"
- 改完必须关掉当前 CMD/PowerShell,新开一个再试
最容易被忽略的是:CLI 和 Apache 用的不是同一份 php.ini,配错一份,另一份照样失败。










