必须为每个$cfg['Servers'][$i]单独显式配置SSL参数,布尔值用true而非字符串,证书路径须绝对且不可复用;否则仅最后一个服务器生效,其余因SSL握手超时失败。

必须为每个 $cfg['Servers'][$i] 单独、显式配置 SSL 参数,布尔值用 true(不是 "true"),证书路径用绝对路径且不可复用——否则只有最后一个服务器生效,其余全卡在握手阶段。
phpMyAdmin 多服务器 SSL 参数必须逐个声明
phpMyAdmin 不继承全局 SSL 设置,$cfg['Servers'][$i] 里漏写任何一项,该节点就会降级或失败。常见错误是循环外统一赋值:$cfg['Servers'][$i]['ssl'] = true,结果 $i 被覆盖,仅最后一个索引生效。
- 每个节点都得完整声明:
$cfg['Servers'][$i]['ssl']、$cfg['Servers'][$i]['ssl_ca']、$cfg['Servers'][$i]['ssl_cert']、$cfg['Servers'][$i]['ssl_key'] -
$cfg['Servers'][$i]['ssl']必须是布尔值true,写成"true"或1会被 phpMyAdmin 完全忽略 - 若某台 MySQL 实际未启用 SSL(
have_ssl=DISABLED),对应节点的ssl必须设为false,否则连接会超时卡死
云数据库 CA 证书不能混用,路径必须绝对且可读
阿里云 RDS、腾讯云 CDB 等强制要求使用控制台下载的专用 CA 证书,不同实例、不同地域的 RDS-Global-Bundle.pem 或 aliyun-rds-ca-cert.pem 内容不同。把 A 实例的证书硬编码到所有节点,B 实例必然报 unknown ca 或 unable to get local issuer certificate。
- 检查每台 MySQL 的
ssl_ca变量值:SHOW VARIABLES LIKE 'ssl_ca'; - 确认 PHP 进程用户(如
www-data)能读取该路径:ls -l /path/to/ca.pem,权限建议644 - 路径必须是绝对路径,
~/certs/或./ca.pem在 PHP 中无法解析
MySQL 服务端 require_secure_transport 与客户端 ssl_mode 必须匹配
MySQL 8.0+ 若设了 require_secure_transport=ON,所有连接(包括 phpMyAdmin)必须走 SSL,且仅 VERIFY_IDENTITY 模式能通过校验;若只设 REQUIRED,服务端会拒绝连接。
立即学习“PHP免费学习笔记(深入)”;
- 进每台 MySQL 执行:
SELECT @@require_secure_transport, @@have_ssl; - 对强制 SSL 的节点,
$cfg['Servers'][$i]['ssl_mode']必须设为VERIFY_IDENTITY(不是REQUIRED),并配齐ssl_ca - 若无法统一策略,可在非关键节点临时关强制要求:
SET PERSIST require_secure_transport = OFF;(需 SUPER 权限)
PDO 连接需 DSN 显式指定 sslmode,且 host 不能用 127.0.0.1
phpMyAdmin 底层用 PDO 连接,ssl_mode=VERIFY_IDENTITY 会校验证书中的域名(CN/SAN)。若 host 填 127.0.0.1,而证书里没有 IP:127.0.0.1,直接握手失败,错误静默不报具体原因。
- DSN 中必须带
?sslmode=VERIFY_IDENTITY,仅靠数组选项不够 -
host必须用域名(如db-prod.example.com)或localhost(部分证书含 DNS:localhost) - Alpine Linux 容器中默认无系统 CA 包,
ssl_ca必须指向挂载进来的完整 bundle,不能依赖/etc/ssl/certs/ca-certificates.crt
最易被忽略的是:不同 MySQL 实例的 require_secure_transport 状态可能不一致,而 phpMyAdmin 配置里却用了同一套 SSL 模式和证书路径——这会导致部分节点连得上、部分握手失败,排查时容易误判为网络或权限问题。



















