“tls handshake failed”是系统级tls握手失败,非composer配置问题;需检查openssl版本(如1.0.2k不支持tls 1.3)、同步配置php.ini中curl.cainfo与openssl.cafile绝对路径、验证ca文件存在可读,并重启服务。

curl -v https://packagist.org/packages.json 报 TLS handshake failed 怎么办
这说明问题出在系统级 TLS 握手,不是 Composer 配置或镜像源的问题。企业代理、老旧 OpenSSL 或防火墙中间设备会主动中断协商过程,导致连接被重置。
先确认是不是这个原因:
- 运行
openssl version,输出为OpenSSL 1.0.2k或更低 → 几乎肯定不支持 TLS 1.3,而 Packagist 已强制要求 - 执行
php -r "print_r(openssl_get_cert_locations());",看default_cert_file和ini_cafile是否为空、路径是否真实存在且可读 -
curl -v https://packagist.org/packages.json卡在* TLS handshake或报error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version→ 握手失败坐实
php.ini 中 curl.cainfo 和 openssl.cafile 必须设成同一绝对路径
只改其中一个没用,PHP 的 cURL 扩展和 OpenSSL 扩展各自读各自的配置项,必须同步生效。
Windows 下尤其容易踩坑:
- 路径写成
C:phpextrassslcacert.pem❌(单反斜杠被当转义符) - 正确写法是
C:/php/extras/ssl/cacert.pem或C:\php\extras\ssl\cacert.pem - Linux/macOS 要确保文件权限为
644,且 PHP 进程有读权限(不能是600或属主不对) - CLI 和 Web 模式可能加载不同
php.ini,务必分别运行php --ini和php -i | grep "Loaded Configuration File"确认
公司内网代理证书怎么加进信任链
浏览器能访问但 Composer 报 unable to get local issuer certificate,基本就是代理用了私有 CA 重签流量,而 PHP 不自动读系统证书库。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
必须手动合并证书:
- 从 IT 部门拿到内网根证书(确认是 PEM 格式,开头为
-----BEGIN CERTIFICATE-----) - 下载最新 Mozilla CA 包:
curl -o cacert.pem https://curl.se/ca/cacert.pem - 合并:Linux/macOS 用
cat company-root.pem cacert.pem > combined.pem;Windows 记事本拼接时注意换行统一为 CRLF - 把
combined.pem放到稳定路径(如/etc/php/certs/combined.pem),然后在php.ini中设:curl.cainfo = "/etc/php/certs/combined.pem"openssl.cafile = "/etc/php/certs/combined.pem" - 重启终端(CLI)或 Web 服务(Apache/Nginx)后,再跑
php -i | grep openssl.cafile验证
COMPOSER_NO_SSL=1 只能用于诊断,不能留着
设了这个环境变量后 composer install 成功,100% 说明是 TLS 或证书问题——但它只是绕过验证,不是修复。
继续用它会有真实风险:
- 所有元数据(
packages.json)明文传输,可被篡改,供应链投毒风险上升 - packagist.org 会 301 强制跳回 HTTPS,设了反而可能陷入重定向循环或连接拒绝
- 私有仓库若配了 HTTP 源,依赖下载全程无加密,凭据和代码都暴露
- CI/CD 流水线中残留该变量,等于给整个交付链路开后门
真正难处理的是证书路径和 OpenSSL 版本的耦合问题:低版本 OpenSSL 即使配对了 CA 文件,也可能因协议不兼容直接断连,这时候光补证书没用,得升级 OpenSSL 或换用兼容的镜像源。










