Composer无法验证自签名证书时典型报错为“cURL error 60: SSL certificate problem: self signed certificate”,根本原因是PHP底层cURL/OpenSSL默认不信任私有CA,需通过环境级配置openssl.cafile指向含完整信任链(叶证书→中间证书→根CA)的PEM文件并重启服务,或全局设置composer config -g cafile,禁用TLS仅限临时调试。

Composer 无法验证自签名证书时的典型报错
运行 composer install 或 composer update 时,如果源服务器使用自签名证书,你会看到类似这样的错误:cURL error 60: SSL certificate problem: self signed certificate。这不是 Composer 自身不支持证书,而是它底层依赖 cURL 和 OpenSSL,而系统默认不信任你的私有 CA 或自签名证书。
让 Composer 信任自签名证书的三种方式
优先级从高到低:环境级 > 用户级 > 项目级。推荐用环境级(即系统级)配置,避免每个项目重复处理。
- 修改 PHP 的
openssl.cafile配置项,指向你合并后的 PEM 文件(含根 CA + 中间证书),重启 Web 服务或 CLI PHP 进程 - 在 Composer 全局配置中设置
cafile:运行composer config -g cafile /path/to/your-chain.crt,该路径必须是 PEM 格式、包含完整信任链的证书文件 - 临时绕过(仅调试):设环境变量
export COMPOSER_DISABLE_TLS=1,但会完全禁用 HTTPS 验证,不推荐用于 CI 或生产
证书文件必须满足的格式与内容要求
Composer(通过 cURL)只接受 PEM 格式、且按「叶证书 → 中间证书 → 根 CA」顺序拼接的单个文件。常见错误包括:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用了 DER(.cer/.crt 二进制)而非 PEM(Base64 编码、以
-----BEGIN CERTIFICATE-----开头) - 只放了服务端证书,没包含签发它的私有 CA 证书
- 顺序颠倒,比如把根 CA 放最前面 —— cURL 要求验证链能从叶证书向上追溯,顺序错会导致“unable to get local issuer certificate”
- 文件权限太宽松(如 777),PHP 可能拒绝加载;建议设为
644并属主为运行 PHP 的用户
验证配置是否生效的快速方法
别等 composer update 失败再排查。直接用 Composer 自带的诊断命令:
composer diagnose --verbose
观察输出中是否出现 CA file: /path/to/your-chain.crt,以及后续有没有 curl: (60) SSL certificate problem 类报错。也可以手动测试连接:curl -v --cacert /path/to/your-chain.crt https://your-private-repo.example.com,确认返回 HTTP 200 且无证书警告。
最易被忽略的是证书链完整性 —— 很多人导出服务端证书就以为够了,其实必须把整个信任路径都塞进 cafile,否则 Composer 依然找不到 issuer。

















