mysql ssl 未启用是多数“ssl error”的根源:需依次检查 have_ssl=yes、ssl_mode≥preferred、ssl_cipher非空;ci3应禁用ssl协商(encrypt=false)、改用127.0.0.1、切换mysql_native_password认证。

确认 MySQL 服务端 SSL 状态是否真启用
很多“SSL error”其实是服务端根本没启用 SSL,只是报错误导。登录 MySQL 命令行,执行三句检查:
- SHOW VARIABLES LIKE 'have_ssl'; → 必须返回 YES,若为 DISABLED 或 NO,说明 MySQL 编译未带 SSL 支持或 my.cnf 没配 ssl-ca/ssl-cert/ssl-key;
- SHOW VARIABLES LIKE 'ssl_mode'; → 至少应为 PREFERRED(PHP 8.1+ 默认要求);
- SHOW STATUS LIKE 'Ssl_cipher'; → 若为空,代表当前连接未走 SSL,服务端 SSL 实际未生效。
CI3 中禁用 SSL 或降级验证强度
CodeIgniter 3 默认不主动配置 SSL 参数,但 PHP 8.1+ 的 mysqli 驱动在连接时会尝试协商 SSL。若服务端证书不可信、过期或路径不对,mysqli::real_connect() 就会抛出 SSL error。最稳妥的临时修复是让 CI3 显式关闭 SSL 协商:
- 打开
application/config/database.php; - 在
$db['default']数组中添加:
'mysqli.default_socket' => null,(避免 Unix socket 干扰)
'encrypt' => false,(CI3 会据此跳过 SSL 初始化)
'stricton' => true,(可选,提升兼容性); - 确保
'hostname'不写localhost,改用'127.0.0.1'—— 这能绕过本地 socket 路径问题,也避免 SSL 握手时因 CN/SAN 匹配失败而中断。
升级认证协议或重置用户权限
MySQL 8.0+ 默认用 caching_sha2_password,而 CI3 底层的 mysqli(尤其 PHP 8.1 旧编译版)可能不支持,导致连接卡在 SSL 协商前就报错。这不是 SSL 本身的问题,但错误堆栈常混在一起显示:
- 登录 MySQL,运行:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 执行 FLUSH PRIVILEGES;;
- 重启 MySQL 服务;
- 再试 CI3 连接——多数情况下 SSL error 消失,因为握手流程已简化。
检查 PHP 扩展与运行时环境
CI3 报 “mysql_real_connect SSL error”,实际可能是 mysqli 扩展加载异常或版本不匹配:
- 运行 php -m | grep mysqli,确认扩展已启用;
- 检查 php --ini 输出的 php.ini 路径,确保该文件中
extension=mysqli未被注释,且不是extension=php_mysql.dll(PHP 7+ 已废弃); - 若用 Docker 或 Alpine,注意系统 CA 证书包可能缺失:需安装
ca-certificates并执行 update-ca-certificates; - CI3 的
$this->db->conn_id若为false,说明连接根本未发起,优先排查上述基础项而非 SSL。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











