答案是必须验证 php cli 模式下 openssl 扩展是否真实加载:运行 php --ini 确认生效的 php.ini 路径,再执行 php -m | grep openssl 和 php -i | grep "openssl support",有输出且显示 enabled 才算成功。

Composer install 报错 “The openssl extension is required for SSL/TLS protection” 时,95% 的情况不是网络或镜像问题,而是 PHP CLI 模式下 openssl 扩展根本没加载成功——必须验证运行时状态,不能只看 php.ini 里有没有取消注释。
怎么确认 openssl 真的在 CLI 下生效了
别改完 php.ini 就以为万事大吉。CLI 和 Web(如 Apache/Nginx)用的是两套配置,Composer 走的是 CLI,所以只看浏览器里的 phpinfo() 没用。
- 运行
php --ini,看清 “Loaded Configuration File” 路径,这才是 Composer 实际读的 php.ini - 执行
php -m | grep openssl,有输出才说明扩展已加载;没输出就等于没启用 - 再跑
php -i | grep "OpenSSL Support",如果返回OpenSSL Support => disabled,说明扩展加载失败(比如 DLL 缺失或依赖库找不到) - Windows 下还要检查
php -v输出的 PHP 版本,避免在旧版 PHP 目录下改了新版的 php.ini
Windows 下 openssl 加载失败的典型原因和修复点
手动解压版 PHP 或 WAMP/XAMPP 用户最容易栽在这里:扩展看似启用了,但运行时静默失败。
- 确保 php.ini 中写的是
extension=openssl(不是extension=php_openssl.dll),PHP 8.0+ 已统一用短名 - 确认
extension_dir指向正确,比如extension_dir = "ext",且该目录下存在php_openssl.dll - PHP 目录下必须有
libssl-1_1-x64.dll和libcrypto-1_1-x64.dll(版本号可能为 3_0 或 3_1,需匹配 PHP 构建所用 OpenSSL 版本) - 改完 php.ini 后,**必须关闭并重新打开命令行终端**(CMD/PowerShell),否则
php -v仍缓存旧配置 - 某些老 PHP 版本(如 7.2 之前)还需启用
extension=sockets,否则 openssl 初始化失败
Linux/macOS 下 openssl 不可用的常见硬伤
不是“系统装了 openssl”,而是 PHP 编译或包管理没把扩展编译进去或装对位置。
- Debian/Ubuntu:运行
sudo apt install php-openssl(注意不是openssl命令本身) - CentOS/RHEL:用
sudo yum install php-opcache同源仓库里的php-openssl,单独装 openssl 库不等于 PHP 能调用 - Docker Alpine 镜像:musl libc 不兼容预编译的 OpenSSL 扩展,直接换
debian:slim基础镜像最省事 - 源码编译 PHP:必须带
--with-openssl参数,且路径要对,例如--with-openssl=/usr而不是/usr/local/ssl
为什么 composer config -g secure-http false 有时无效
这个配置只控制是否强制仓库用 HTTPS 协议,**不跳过证书校验**。真正报 “certificate verify failed” 是 PHP 层的 stream/cURL 在验签失败。
-
--no-secure-http只对部分旧版 Composer 有效,PHP 8.2+ 和新版 Composer 已拒绝降级 HTTP - 临时调试可用
COMPOSER_NO_SSL=1环境变量,但仅限离线环境或可信内网 - 真正要解决证书问题,得配
openssl.cafile或curl.cainfo指向有效的cacert.pem(从 https://curl.se/ca/cacert.pem 下载) - 企业环境若装了中间人代理(如 Fiddler、上网行为管理设备),证书链被重签,就得把代理根证书加进 cafile,否则任何 HTTPS 请求都失败
最容易被忽略的是:同一台机器上多个 PHP 版本共存时,php 命令指向的版本和 composer 实际调用的 PHP 解释器可能不一致——先查 which php 和 composer diagnose 输出的 PHP 路径,再动手改配置。











