“不受信任的源”实为PHP底层OpenSSL拒绝加载证书链,需确保cafile指向含完整信任链的PEM文件;可运行php -r "print_r(openssl_get_cert_locations());"确认default_cert_file路径及内容有效性。

“不受信任的源”不是 Composer 在拦你,而是 PHP 底层 OpenSSL 拒绝加载证书链——必须让 cafile 指向含完整信任链的 PEM 文件,而不是关掉校验。
报错 cURL error 60: SSL certificate problem: self signed certificate 怎么确认根源
这不是 Composer 自己报的错,是 PHP 调用 cURL 时被 OpenSSL 拦下的。关键线索在:openssl_get_cert_locations() 返回的 default_cert_file 路径是否可读、内容是否有效。
- 运行
php -r "print_r(openssl_get_cert_locations());",记下default_cert_file值 - 检查该文件是否存在:
ls -l /path/to/cacert.pem;常见问题包括:文件为空、权限为 777(PHP 拒绝加载)、路径根本不存在 - 如果用的是 Homebrew PHP(macOS),
default_cert_file常指向一个已停更的curl-ca-bundle.crt,建议重装:brew reinstall ca-certificates && brew link --force ca-certificates
如何把自签名根证书加进系统信任链(推荐)
这是最彻底的做法,影响所有 PHP HTTPS 请求(file_get_contents、cURL、Composer 全部生效)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(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):
sudo cp your-company.crt /usr/local/share/ca-certificates/ && sudo update-ca-certificates - macOS:双击 .crt → “钥匙串访问” → 选“系统”钥匙串 → 右键证书 → “显示简介” → “信任” → 设为“始终信任”
- Windows:双击 .crt → “安装证书” → “本地计算机” → 存储位置选“受信任的根证书颁发机构”
只给 Composer 单独配 cafile(适合容器或 CI)
当无法修改系统证书库时(比如 Alpine 镜像、GitHub Actions runner),就显式指定证书路径:
- 把 PEM 证书(含完整链:叶证书 → 中间 → 根 CA)放到固定位置,如
/certs/company-root.crt - 设全局配置:
composer config -g cafile /certs/company-root.crt - 注意:这个配置仅对
composer命令生效,不影响其他 PHP 组件;且若项目用了vendor/bin/composer,它默认忽略全局配置
别踩这些坑
很多“换源后仍报错”其实和镜像无关,而是证书链没理清:
-
composer config -g secure-http false和cafile /dev/null只能临时调试,生产环境禁用 - 证书文件里不能混入非 PEM 内容(比如注释、空行、多余文本),否则 OpenSSL 解析失败
- 如果用了企业代理并做了 TLS 中间人,光加根证书不够,还要确认代理证书是否已导出为 PEM 并追加到 bundle 中
- 时间偏差 >5 分钟也会触发证书校验失败,先运行
date确认系统时间准确
真正卡住人的,往往不是证书文件放哪了,而是它里面缺中间证书、顺序颠倒、或者被 chmod 777 过——PHP 会静默跳过这类文件,连 warning 都不抛。

















