自定义源SSL错误主因是PHP未信任其内网/自签名证书:需将私有CA根证书添加至php.ini的openssl.cafile和curl.cainfo,并重启终端;Git源还需单独配置git sslCAInfo或禁用verify_peer。

自定义源(如私有 Packagist、GitLab Package Registry、Nexus PHP 仓库)配置后 composer install 报 SSL 证书错误,不是 Composer 不支持 HTTPS,而是它严格复用 PHP 的 OpenSSL 和 cURL 校验链——一旦自定义源的证书由内网 CA 签发、或用了自签名证书、或系统没加载对应根证书,就会卡在 SSL3_GET_SERVER_CERTIFICATE 或 unable to get local issuer certificate。
确认是自定义源而非 packagist.org 的证书问题
很多人一看到 SSL 错误就去修全局 CA,结果白忙活。关键要先隔离问题来源:
- 运行
composer config repo.your-repo(把your-repo换成你自定义源的键名),确认 URL 是https://开头且可访问 - 手动用
curl -v https://your-private-repo.com/packages.json测试——如果也报同样证书错误,说明问题出在该域名本身,和 Composer 无关 - 对比
composer config -g repo.packagist,确保没意外覆盖了全局源;私有源必须显式声明,不能依赖 fallback - 检查
composer.json中repositories数组里是否混入了 HTTP 源(哪怕一个),会导致整个安装流程降级失败
让 PHP 信任你的私有源证书(推荐方式)
不建议关验证,而应把内网 CA 或自签名证书加进 PHP 的信任链。操作分三步,缺一不可:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 把你的私有 CA 根证书(PEM 格式,通常叫
ca.crt或root-ca.pem)拷贝到一个确定路径,比如/etc/ssl/private/internal-ca.pem(Linux/macOS)或C:\php\extras\ssl\internal-ca.pem(Windows) - 编辑 CLI 模式下生效的
php.ini(执行php --ini查看 Loaded Configuration File),添加两行:openssl.cafile = "/etc/ssl/private/internal-ca.pem"curl.cainfo = "/etc/ssl/private/internal-ca.pem" - 重启终端(CLI 不重载 ini),再跑
php -r "print_r(openssl_get_cert_locations());",确认ini_cafile和default_cert_file都指向你刚写的路径
临时跳过单个自定义源的证书校验(仅限调试)
如果你只是想快速验证包逻辑是否正确,且环境完全隔离(比如本地 Docker 容器、CI 临时 job),可用环境变量绕过,**不影响其他源**:
- Linux/macOS:
COMPOSER_CAFILE=/dev/null composer install --repository-url=https://your-private-repo.com - Windows CMD:
set COMPOSER_CAFILE= && composer install --repository-url=https://your-private-repo.com - 注意:
--repository-url必须显式传入,否则 Composer 仍会走composer.json里的配置并触发校验 - 别用
composer config -g disable-tls true——它会让所有源退化到 HTTP,而你的私有源很可能不支持 HTTP
Git 类 source 包的证书问题常被忽略
如果你的 composer.json 里有 "type": "package" 或直接引用 Git 仓库("vcs"),Composer 会改用 git clone 下载,这时证书校验由 Git 自己控制,和 PHP 的 openssl.cafile 无关:
- 查 Git 当前 CA 设置:
git config --global http.sslCAInfo,若为空或指向旧文件,需更新:git config --global http.sslCAInfo "/path/to/internal-ca.pem" - Git 还可能读系统级证书(如 macOS Keychain、Windows Cert Store),私有源证书必须导入对应系统信任库
- 更简单的方式:对 Git 源加
"options": {"https": {"verify_peer": false}}到repositories条目中(仅限可信内网)
最易漏掉的是 Git 与 Composer 双层证书校验——你以为配好了 PHP 的 cafile 就万事大吉,结果 git clone 还在用自己的证书链报错。务必分清下载路径:dist ZIP 走 PHP/cURL,source Git 走 Git 二进制,两者证书配置完全独立。

















