composer识别公司内网ca证书需配置含完整链的pem文件(中间ca在前、根ca在后),全局设置composer config --global ssl.cafile,确保php进程有读权限且路径正确,否则≥2.5版本会静默回退至系统ca导致curl error 60。

Composer 默认不信任私有 HTTPS 仓库的证书,必须显式配置 CA 路径或禁用验证(不推荐),否则会报 cURL error 60: SSL certificate problem。
如何让 composer 识别公司内网 CA 证书
关键不是“加证书”,而是提供一个 OpenSSL 能解析的、含完整链的 PEM 文件。很多团队直接把 company-ca.crt 往 ssl.cafile 一塞就失败,原因通常是:
- 文件是 DER 格式(Windows
.cer)而非 PEM——用openssl x509 -inform DER -in company-ca.cer -outform PEM -out ca.pem转换 - 只放了根 CA,没合并中间 CA——运行
cat intermediate.pem root.pem > combined.pem拼接,顺序不能反 - 文件开头多了 BOM 或空行——用
head -n1 ca.pem | hexdump -C检查是否以-----BEGIN CERTIFICATE-----开头 - PHP 进程无读权限——尤其在 nginx/php-fpm 下,
www-data用户可能读不了/home/user/certs/
composer config ssl.cafile --global 为什么经常不生效
因为 Composer ≥2.5 的加载逻辑变了:它先尝试用 ssl.cafile 初始化 OpenSSL 上下文,失败就静默 fallback 到系统默认路径,不会报错提示你文件错了。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 确认是否真生效:
composer config --global --list | grep ssl.cafile,输出应为绝对路径 - 检查该路径文件是否存在且可读:
php -r "echo file_get_contents('/etc/ssl/certs/company-ca.pem') ?: 'fail';" - 若仍报错 60,临时加
-vvv看详细日志:composer install -vvv 2>&1 | grep -A5 -B5 'cafile' - 不要用项目级配置(即不带
--global)——它只影响当前项目的composer.json解析,不影响网络层 TLS 握手
macOS 更新后 composer 报 SSL 错误怎么办
不是证书“丢了”,而是 PHP 使用的 OpenSSL 不再自动加载系统证书。Homebrew 安装的 PHP 通常不读 /etc/ssl/cert.pem。
- 先装证书包:
brew install ca-certificates - 找对路径:
brew --prefix openssl@3→ 得到类似/opt/homebrew/opt/openssl@3,证书在etc/openssl@3/cert.pem - 全局设 cafile:
composer config --global cafile /opt/homebrew/opt/openssl@3/etc/openssl@3/cert.pem - 验证 PHP 是否用了对的 OpenSSL:
php -i | grep -E "(openssl|cafile)",确认openssl.cafile值与上面一致
最易被忽略的一点:即使你配对了 ssl.cafile,如果私有仓库用了自签名证书且未包含在该 PEM 文件中,错误仍是 60 —— 此时不是配置问题,而是证书链本身不完整,得让运维补全中间证书并重新生成 PEM 合并文件。










