phpMyAdmin不支持多节点自动管理MySQL双向SSL,必须为每个$cfg['Servers'][$i]显式配置ssl、ssl_ca、ssl_cert、ssl_key、ssl_mode全套参数;服务端require_secure_transport=ON与用户REQUIRE SUBJECT须同步生效,否则静默报Access denied。

phpMyAdmin 本身不支持在多节点环境下自动启用或管理 MySQL 的 SSL 双向认证(mTLS),必须为每个服务器单独、显式配置全套 SSL 参数,且服务端 require_secure_transport 和用户级 REQUIRE SUBJECT 必须同步生效;否则连接会静默失败,报错却显示 Access denied for user,而非明确的 SSL 错误。
每个 $cfg['Servers'][$i] 必须填满全部 SSL 键,不能只设 ssl = true
phpMyAdmin 不继承、不默认补全、不提示缺失项。漏掉 ssl_ca、ssl_cert、ssl_key 或 ssl_mode 中任意一个,整个 SSL 配置就退化为明文连接,且无任何警告。
-
$cfg['Servers'][$i]['ssl']必须是布尔值true(不能是字符串"true"或整数1) -
$cfg['Servers'][$i]['ssl_ca']指向该 MySQL 实例专属的 CA 证书绝对路径(如/etc/pma/certs/rds-shanghai.pem),云数据库不可复用其他实例证书 -
$cfg['Servers'][$i]['ssl_cert']和$cfg['Servers'][$i]['ssl_key']必须成对出现,即使服务端未要求客户端证书,也要设为空字符串或null -
$cfg['Servers'][$i]['ssl_mode']推荐设为VERIFY_IDENTITY(不是REQUIRED),尤其对接阿里云 RDS、腾讯云 CDB 等云服务时
服务端 require_secure_transport = ON 是双向认证的硬门槛
没有这一步,所有客户端 SSL 配置都无效——MySQL 仍允许非加密连接,REQUIRE SUBJECT 根本不会触发校验。它和 phpMyAdmin 的 ssl_mode 完全无关,是独立的服务端强制策略。
- 必须写在 MySQL 的
[mysqld]段中,重启后执行SELECT @@require_secure_transport;确认返回ON - 若某台服务器没开此选项,而你又在 phpMyAdmin 里配了
ssl = true,连接可能成功但走的是明文,你以为安全了,其实没有 - 检查所有节点一致性:同一套 phpMyAdmin 配置下,不同 MySQL 实例的
require_secure_transport值可能不同,导致部分节点连得上、部分报 SSL error
客户端证书 DN 必须与 REQUIRE SUBJECT 逐字匹配
服务端创建用户时用的 REQUIRE SUBJECT 值,必须和客户端证书的 Subject 字段完全一致,包括空格、斜杠顺序、大小写。不匹配时,MySQL 直接拒绝登录,错误信息仍是模糊的 Access denied。
立即学习“PHP免费学习笔记(深入)”;
- 用命令确认客户端证书 Subject:
openssl x509 -in client-cert.pem -subject -noout - 创建用户语法必须是:
CREATE USER 'u'@'%' REQUIRE SUBJECT '/CN=client1/O=myorg'; -
GRANT或ALTER USER无法追加或修复REQUIRE SUBJECT;一旦写错,只能DROP USER重建 - 私钥文件权限必须为
600,PHP 进程需有读取权限,否则 phpMyAdmin 初始化 PDO 时会静默失败
多节点配置必须用循环生成,避免索引断档或语法错误
手动写 $cfg['Servers'][1]、$cfg['Servers'][2] 极易因索引跳号、漏分号、引号不闭合等问题,导致 phpMyAdmin 在遍历时直接中止加载——后续所有服务器都不会出现在登录页下拉列表中。
- 索引必须从
1开始连续递增,不能用0或中间跳过(如只有[1]和[3]) - 每个节点子数组必须含
'host'(或'socket')和'auth_type' => 'cookie',缺一不可 - 推荐结构:
$hosts = [1 => ['host' => 'db1.example.com', 'ssl_ca' => '/path/to/ca1.pem'], 2 => [...]];,再用foreach统一赋值 - 别在配置块中混写 PHP 注释(如
// server 1),PHP 解析器会将其当字符串拼入数组,引发语法错误
最易被忽略的点是:phpMyAdmin 的 SSL 配置只影响连接建立阶段,它不参与服务端对客户端证书的校验逻辑;真正决定双向认证是否生效的,是 MySQL 的 require_secure_transport + 用户 REQUIRE SUBJECT + 客户端传入的 PEM 文件三者是否严丝合缝。任何一个环节松动,安全链条就断了,而且断得悄无声息。



















