应先确认php cli模式下openssl扩展是否真实启用,检查php --ini路径下的php.ini中extension=openssl是否开启,并确保openssl.cafile与curl.cainfo指向同一有效cacert.pem文件,禁用tls仅作临时调试用。

php -m 里没 openssl 就别试 composer 了
执行 composer install 或 composer update 报 [Composer\Exception\NoSslException] The openssl extension is required for SSL/TLS protection but is not available,第一反应不是改 Composer 配置,而是确认 PHP 是否真加载了 openssl 扩展。
常见错误现象:
-
php -m | grep openssl无输出 -
php -i | grep "OpenSSL Support"返回disabled - 浏览器打开
phpinfo()显示 OpenSSL enabled,但命令行下不生效(CLI 和 Web 使用不同php.ini)
实操建议:
- 运行
php --ini查看 CLI 模式下实际加载的php.ini路径,只改这个文件 - Windows 下检查
extension=openssl(不是extension=php_openssl.dll),且extension_dir指向正确的ext目录 - 确认 PHP 目录下存在
libssl-1_1-x64.dll和libcrypto-1_1-x64.dll(PHP 8.1+ 常见缺失项),缺了它们扩展会静默失败 - 改完必须重启终端(CMD/PowerShell),否则
php -v仍读旧环境
openssl.cafile 和 curl.cainfo 必须指向同一 cacert.pem
即使 openssl 扩展已启用,composer install 仍报 SSL certificate problem: unable to get local issuer certificate,大概率是 CA 证书路径没对齐。
使用 php -r "print_r(openssl_get_cert_locations());" 检查输出中的 default_cert_file 和 ini_cafile 字段:
- 两者为空、路径不存在、或指向不同文件 → HTTPS 请求必然失败
- 路径含空格或中文、用单反斜杠(
C:\php\cacert.pem)→ PHP 不识别
实操建议:
- 下载最新
cacert.pem(如从 https://curl.se/ca/cacert.pem),保存为绝对路径,例如/usr/local/etc/php/cacert.pem(Linux/macOS)或C:/php/cacert.pem(Windows) - 在 CLI 生效的
php.ini末尾添加两行(值必须完全一致):curl.cainfo = "/usr/local/etc/php/cacert.pem"openssl.cafile = "/usr/local/etc/php/cacert.pem" - Linux/macOS 下运行
ls -l /path/to/cacert.pem确认权限为 644;Alpine 容器需额外执行apk add ca-certificates
disable-tls 是临时止痛药,不是解药
执行 composer config -g --disable-tls true 后命令能跑通,不代表问题解决了——它只是让 Composer 放弃 HTTPS 校验,降级走 HTTP 或跳过证书验证。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
风险与限制:
- 私有源(如 Artifactory、Satis)通常强制 HTTPS,此配置直接失效
- PHP 8.2+ 已废弃
CURLOPT_SSL_VERIFYPEER = false,部分新版 Composer 会拒绝执行 - 中间人劫持风险真实存在,尤其在公共 Wi-Fi 或企业代理环境下
仅限以下场景临时使用:
- 内网离线开发,确定无 HTTPS 依赖
- 调试阶段快速验证是否为证书问题(成功则说明 openssl 已启但 CA 配置错)
- CI 环境中无法控制基础镜像(如 Alpine + musl),且无法换 debian:slim
切记:生产环境、团队协作项目、任何涉及敏感依赖的场景,禁用 TLS 都不可接受。
Docker 和 WAMP 用户最容易漏掉的点
WAMP/XAMPP 用户常在图形界面里点开“PHP 扩展”启用 openssl,结果 CLI 下依然报错;Docker 用户在 php:alpine 镜像里装了 php-opcache 却忘了 php-openssl 包。
关键差异:
- WAMP 的 Apache 和 CLI 使用两套
php.ini:Apache 的在bin/apache/php.ini,CLI 的在bin/php/phpX.X.X/php.ini—— 你改的是哪一份? - Docker 中
php --modules | grep openssl无输出,不是扩展没编译,而是 Alpine 默认不带php-openssl,得加apk add php82-openssl(版本号按实际调整) - Windows 下把
ssleay32.dll和libeay32.dll复制到C:\Windows\System32是过时做法,PHP 7.4+ 已不再依赖这两个 DLL
真正该盯住的只有三件事:CLI 模式下的 php.ini 路径、extension=openssl 是否生效、openssl.cafile 和 curl.cainfo 是否指向可读的同一文件。其余操作都是在绕弯子。










