必须为每台服务器显式配置全部五个SSL键(ssl、ssl_ca、ssl_cert、ssl_key、ssl_mode),缺一则静默退化为明文连接;云数据库CA证书须按实例单独下载并指定专属路径;多服务器必须用从1开始连续索引的循环动态生成,避免硬编码导致加载中断。

phpMyAdmin 5.2 连多台远程 MySQL 并启用 SSL,必须为每台服务器单独配齐全部 SSL 键,漏一个就退化为明文连接,且不报错——这是最常踩的坑。
每个 $cfg['Servers'][$i] 必须显式声明全部 SSL 键
phpMyAdmin 不继承、不默认、不补全 SSL 配置。哪怕只写 $cfg['Servers'][$i]['ssl'] = true,其余键为空或缺失,连接就会静默走非加密通道。
必须同时设置以下五项(哪怕某台 MySQL 不需要客户端证书,也要显式设为空字符串):
-
$cfg['Servers'][$i]['ssl']:布尔值true或false,不能是"true"或1 -
$cfg['Servers'][$i]['ssl_ca']:CA 证书绝对路径,如/etc/pma/certs/rds-shanghai.pem -
$cfg['Servers'][$i]['ssl_cert']:客户端证书路径(双向认证才需),否则设为'' -
$cfg['Servers'][$i]['ssl_key']:对应私钥路径,权限必须为600 -
$cfg['Servers'][$i]['ssl_mode']:推荐VERIFY_IDENTITY(不是REQUIRED),尤其对接云数据库时
云数据库 CA 证书不能复用,必须按实例下载专属文件
阿里云 RDS、腾讯云 CDB 等平台生成的 CA 证书含实例指纹。把 A 实例下载的 rds-ca-2023.pem 直接套到 B 实例,OpenSSL 校验会失败,报 unknown ca 或 unable to get local issuer certificate。
立即学习“PHP免费学习笔记(深入)”;
实操要点:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 登录每台云数据库控制台,单独下载其提供的 CA 证书
- 存为不同文件名,例如:
/etc/pma/certs/rds-shanghai.pem、/etc/pma/certs/rds-beijing.pem - 在对应
$cfg['Servers'][$i]中,ssl_ca必须指向该实例专属路径 - 用
openssl x509 -in /path/to/cert.pem -text -noout | grep "Subject:"确认证书颁发者是否匹配实例地域/账号信息
多服务器配置必须用循环生成,索引从 1 开始连续
手动硬编码 $cfg['Servers'][1]、$cfg['Servers'][2] 极易因索引跳号、语法错误或空值导致 phpMyAdmin 遍历中止——后续服务器完全不加载,下拉列表只剩一个或直接空白。
正确做法是定义干净的 $hosts 数组,再用 foreach 动态填充:
$hosts = [
1 => ['host' => 'mydb-sh.cpolar.io', 'port' => 12345, 'ca_path' => '/etc/pma/certs/rds-shanghai.pem'],
2 => ['host' => 'mydb-bj.cpolar.io', 'port' => 12345, 'ca_path' => '/etc/pma/certs/rds-beijing.pem'],
];
foreach ($hosts as $i => $h) {
$cfg['Servers'][$i]['host'] = $h['host'];
$cfg['Servers'][$i]['port'] = $h['port'] ?? 3306;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['verbose'] = $h['host'];
$cfg['Servers'][$i]['ssl'] = true;
$cfg['Servers'][$i]['ssl_ca'] = $h['ca_path'];
$cfg['Servers'][$i]['ssl_cert'] = '';
$cfg['Servers'][$i]['ssl_key'] = '';
$cfg['Servers'][$i]['ssl_mode'] = 'VERIFY_IDENTITY';
}
务必加 $cfg['LoginCookieValidity'] = 86400;,否则 cookie session 过期太快,频繁掉线。
MySQL 服务端 require_secure_transport 与 ssl_mode 必须协同
一台连得上、另一台报 SSL connection error,八成是服务端策略不一致。MySQL 8.0+ 若设了 require_secure_transport = ON,则所有连接(包括 phpMyAdmin)必须走有效 SSL,且 ssl_mode 不能是 DISABLED 或 PREFERRED。
检查命令:
- 登录每台 MySQL 执行:
SELECT @@require_secure_transport, @@have_ssl; - 确认
have_ssl返回YES,否则证书路径或权限有问题 - 若
require_secure_transport为ON,客户端必须提供有效 CA 且ssl_mode≥VERIFY_CA
证书路径必须 PHP 进程可读,且私钥文件权限严格为 600;pdo_mysql 实际依赖 DSN 中的 ssl_options,phpMyAdmin 的配置只是封装层——底层出问题,上层再配也没用。


















