答案是PHP底层OpenSSL/cURL拒绝验证未被信任的证书链,需正确配置含完整信任链(叶证书→中间证书→根CA)的PEM文件路径并确保权限与顺序正确,而非禁用TLS。

Composer 报 cURL error 60: SSL certificate problem: self signed certificate 或 unable to get local issuer certificate,不是 Composer 本身不支持证书,而是 PHP 底层的 OpenSSL/cURL 拒绝验证未被信任的证书链。解决核心是让证书路径被正确加载、内容完整、顺序正确,而不是关 TLS。
确认 PHP 实际使用的证书路径
Composer 的 HTTPS 行为受 PHP 的 OpenSSL 配置控制,不是它自己决定用哪个 CA 文件。先查清楚 PHP 真正在读哪儿:
- 运行
php -r "print_r(openssl_get_cert_locations());",重点看default_cert_file和default_cert_dir的值 - 检查该路径是否存在、可读(
ls -l /path/to/default_cert_file),常见错误是文件为空、权限为 777(PHP 拒绝加载)、或指向一个不存在的 bundle - 如果你用的是 Homebrew PHP(macOS),
default_cert_file往往指向一个过期或损坏的curl-ca-bundle.crt;建议重装:brew reinstall ca-certificates && brew link --force ca-certificates
把自签名根证书追加到系统 CA bundle(推荐)
这是最稳定、影响范围最广的做法,适用于所有 PHP HTTPS 请求(包括 Composer、cURL、file_get_contents 等)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 确保你手上有 PEM 格式的根 CA 证书(以
-----BEGIN CERTIFICATE-----开头,不是 .pfx/.der) - Linux(Debian/Ubuntu):复制到
/usr/local/share/ca-certificates/your-company.crt,再执行sudo update-ca-certificates - CentOS/RHEL:追加到
/etc/pki/tls/certs/ca-bundle.crt或使用sudo trust extract-compat刷新 - macOS:双击 .crt → “钥匙串访问” → 选“系统”钥匙串 → 右键证书 → “显示简介” → “信任” → 设为“始终信任”
- Windows:双击 .crt → “安装证书” → “本地计算机” → 存储位置选“受信任的根证书颁发机构”
为 Composer 单独指定 cafile(适合 CI 或容器环境)
当无法修改系统证书库(如 Docker Alpine 镜像、CI runner),就让 Composer 显式用你提供的证书文件。
- 把 PEM 格式证书(含完整链:叶证书 → 中间 → 根 CA)放到固定路径,比如
/certs/company-root.crt - 设全局配置:
composer config -g cafile /certs/company-root.crt - 注意:这个配置只对
composer命令生效,不影响 PHP 其他组件;且如果用了vendor/bin/composer,它默认忽略全局配置,得在项目composer.json的config段里写:"cafile": "/certs/company-root.crt" - 路径必须是绝对路径;相对路径会以当前执行目录为基准解析,CI 中容易出错
为什么证书链顺序和格式总出错
哪怕你有了正确的 .crt 文件,Composer 还是报错,大概率是证书链拼接方式不对。
- cURL 要求 PEM 文件中证书按「从叶证书到根 CA」顺序排列,即服务端证书在最前,中间证书居中,根 CA 在最后 —— 不能倒过来
- 不能只放服务端证书(
server.crt),必须包含签发它的全部上级证书;用openssl x509 -in server.crt -text -noout | grep "Issuer:"查 issuer,再找对应 CA 补全 - 别用
.cer或.pfx直接当 PEM 用;导出 PEM:openssl x509 -in cert.cer -inform DER -out cert.pem或openssl pkcs12 -clcerts -nokeys -in cert.pfx -out cert.pem - 文件权限不能太宽松(如 777),PHP 会拒绝加载;设为
644,属主为运行 PHP 的用户
最容易被忽略的是证书链完整性——很多人只导出服务端证书就以为够了,但 cURL 验证时找不到 issuer,根本不会继续往下查。验证是否生效,不要等 composer install 失败,直接跑 composer diagnose 看输出里有没有 CA file: /xxx 和 SSL: OK。

















