必须升级php绑定的openssl库版本——php -m显示openssl仅说明扩展已启用,若php -i显示openssl 1.0.1e或更旧版本,则不支持tls 1.2+加密套件,导致composer install报“no ciphers available”或“ssl operation failed”,需替换dll(windows)或重装php-openssl包(linux/macos)并确认cli下php -r "print_r(openssl_get_cipher_methods());"包含aes-128-gcm等现代算法。

php -m 显示 openssl 但 composer install 仍报加密算法不支持
这不是 Composer 本身的问题,而是 PHP 运行时加载的 OpenSSL 库版本太旧,不支持现代 TLS 握手所需的加密套件(比如 TLS 1.2+ 的 ECDHE、AES-GCM)。Packagist 和 getcomposer.org 已全面弃用 SSLv3/TLS 1.0,PHP 若链接的是 OpenSSL 1.0.1 或更早版本,就会在 composer install 时卡在 “SSL operation failed” 或直接提示 “no ciphers available”。
验证方式很简单:
- 运行
php -r "print_r(openssl_get_cipher_methods());",如果输出里没有aes-128-gcm、aes-256-gcm、chacha20-poly1305等,基本可判定 OpenSSL 太老 - 运行
php -i | grep "OpenSSL Version",若显示OpenSSL 1.0.1e或0.9.8,必须升级
Windows 下替换 OpenSSL DLL 文件的实操要点
多数 Windows 用户用的是 PHP 官方二进制包(非 WAMP/XAMPP),其 OpenSSL 依赖是静态链接或通过 DLL 加载的。关键不是重装 PHP,而是换掉底层 DLL。
- 确认当前 PHP 使用的 OpenSSL 版本:
php -i | grep "OpenSSL Library Version" - 去 https://www.php.cn/link/21b64b533c7445e6d7ccb6345af652b7 下载对应架构(x64/x86)的 Light 版本 OpenSSL(例如 Win64 OpenSSL v3.0.13 Light)
- 安装时勾选 “Copy OpenSSL DLLs to: The OpenSSL binaries (/bin) directory”,安装完成后,从安装目录(如
C:\OpenSSL-Win64\bin)复制libssl-3.dll和libcrypto-3.dll到你的 PHP 根目录(和php.exe同级) - 删掉旧的
libssl-1_1-x64.dll和libcrypto-1_1-x64.dll(如果有),避免冲突 - 重启终端,再运行
php -i | grep "OpenSSL Library Version",应显示类似OpenSSL 3.0.13
Linux/macOS 升级 OpenSSL 后 PHP 仍不识别?检查链接路径
系统升级了 OpenSSL(比如用 brew install openssl@3 或 apt install openssl),但 PHP 编译时绑定的仍是旧库路径,php -i 里看到的版本不会变。
- 先查 PHP 是怎么编译的:
php-config --configure-options,看是否有--with-openssl=指向旧路径 - macOS 上常见问题:Homebrew 安装的 OpenSSL@3 默认在
/opt/homebrew/opt/openssl@3,但 PHP 可能仍连着/usr/bin/openssl;需重新编译 PHP 或用pecl install channel://pecl.php.net/openssl-8.2.0(不推荐) - 更稳妥的做法:用
brew install php重装整个 PHP,它会自动绑定最新 OpenSSL - Ubuntu/Debian 用户执行:
sudo apt install php8.2-opcache php8.2-curl php8.2-xml php8.2-zip php8.2-mbstring php8.2-openssl—— 注意必须显式安装php8.2-openssl包,否则扩展不生效
openssl.cafile 配置错误导致“certificate verify failed”
即使 OpenSSL 版本够新,composer install 仍可能报 error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed,这几乎 100% 是 CA 证书路径没配对或文件过期。
- 运行
php -r "print_r(openssl_get_cert_locations());",看default_cert_file路径是否真实存在且可读 - 若路径是
/etc/ssl/cert.pem但文件不存在,去 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251 下载最新cacert.pem,保存到该路径 - 在
php.ini中强制指定(尤其 Windows):openssl.cafile = "C:\php\extras\ssl\cacert.pem"curl.cainfo = "C:\php\extras\ssl\cacert.pem" - 改完后不用重启 Web 服务,但 CLI 下要新开终端,再跑
php -r "var_dump(openssl_get_cert_locations());"确认已生效
最常被忽略的一点:PHP CLI 和 Web SAPI 使用的 php.ini 是两份,而 composer 只走 CLI;哪怕浏览器里 phpinfo() 显示 OpenSSL 已启用,CLI 下可能完全没加载。务必用 php --ini 和 php -m 在终端里验证,别信界面。











