“alert handshake failure”主因是TLS协议版本或加密套件不匹配,而非证书错误;需依次排查TLS版本兼容性、密码套件交集、SNI与证书链完整性、系统级安全策略限制,并用浏览器Security面板或OpenSSL验证。

这是 OpenSSL 证书链或协议支持缺失导致的 TLS 握手失败,不是 Composer 配置问题。错误通常表现为 SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version 或 unable to get local issuer certificate,本质是 PHP 的 cURL 扩展无法完成 HTTPS 连接协商。
检查 PHP 实际加载的 openssl 和 cafile 路径
Composer 依赖 PHP 的 OpenSSL 扩展和可信 CA 证书文件。很多报错看似“无可用安全协议”,实则是证书路径没配对或版本太旧。
- 运行
php --ini确认 CLI 模式下真实生效的php.ini路径(别信 Web 环境的 phpinfo) - 运行
php -r "print_r(openssl_get_cert_locations());"查看default_cert_file和ini_cafile值——这两个路径必须存在且可读 - 若输出为空、路径不存在,或
cat /path/to/cacert.pem报错,说明证书文件缺失或损坏
强制更新并绑定 cacert.pem 到 php.ini
Windows 和部分 Linux 发行版(尤其自编译 PHP)常缺最新根证书。别用系统自带的 cert.pem,直接下载权威来源:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 从
https://curl.se/ca/cacert.pem下载最新cacert.pem - 保存为绝对路径,例如
/usr/local/etc/php/cacert.pem(Linux/macOS)或C:\php\extras\ssl\cacert.pem(Windows) - 在
php.ini中显式设置两处:curl.cainfo = "/usr/local/etc/php/cacert.pem"openssl.cafile = "/usr/local/etc/php/cacert.pem" - 改完重启终端(CLI 不需要 reload Apache/Nginx)
禁用 keep-alive 避免 NAT 设备伪造 RST 干扰 TLS 握手
某些网络环境下(如企业内网、校园网、云主机 NAT 网关),cURL 复用连接时会被中间设备发 RST 中断,表现就是 TLS 握手卡住或报“protocol version”错误——其实不是协议不支持,而是 socket 已失效。
- 临时绕过:Linux/macOS 下执行
CURL_OPTIONS="--no-keepalive" composer install - Windows cmd 下:先
set CURL_OPTIONS=--no-keepalive,再运行composer install - PowerShell 下:
$env:CURL_OPTIONS="--no-keepalive"; composer install - 这个操作让每次请求都新建 TCP 连接,跳过被污染的 keep-alive 连接池
确认 secure-http 和镜像源协议是否匹配
如果手动配置过非 HTTPS 镜像源(比如 http://packagist.phpcomposer.com),而 secure-http 为 true(默认),Composer 会直接拒绝连接,错误可能被误读为“无安全协议”。
- 检查当前全局镜像:
composer config -g repo.packagist,输出必须是https://mirrors.aliyun.com/composer/这类 HTTPS 地址 - 确保命令中带
composer类型标识:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 禁用
secure-http是高危操作(所有包传输裸奔),仅限调试:composer config -g secure-http false
最易被忽略的是:openssl_get_cert_locations() 返回的路径和 php.ini 里写的路径不一致,或者证书文件权限为 root 且当前用户不可读。别只改配置,要验证路径真实可访问。

















