phpmyadmin ssl连接需为每个服务器显式配置全部ssl键(ssl、ssl_ca、ssl_cert、ssl_key、ssl_mode),缺一不可;云数据库须用实例专属ca证书;pdo_mysql实际依赖dsn中ssl_options,且证书路径须php进程可读。

每个 $cfg['Servers'][$i] 必须显式配置全套 SSL 键
phpMyAdmin 不会继承或复用 SSL 配置,哪怕你只漏掉一个键,整个 SSL 连接就会退化为非加密连接,且不报错。常见错误是只写 $cfg['Servers'][$i]['ssl'] = true,却没配 ssl_ca、ssl_cert、ssl_key——结果 phpMyAdmin 会静默忽略 SSL 设置,连握手都不发起。
必须为每个服务器索引 $i 单独声明以下全部键(即使某台 MySQL 不需要客户端证书,也要显式设为空字符串或 null):
-
$cfg['Servers'][$i]['ssl']:布尔值true或false,不能是"true"或1 -
$cfg['Servers'][$i]['ssl_ca']:CA 证书绝对路径,如/etc/ssl/rds-ca-2023.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-Global-Bundle.pem 直接套用到 B 实例,连接时大概率报 unknown ca 或 unable to get local issuer certificate。这不是 phpMyAdmin 的 bug,而是 OpenSSL 校验失败。
实操要点:
- 每个云数据库实例必须单独下载其控制台提供的 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:"确认证书颁发者是否匹配实例地域/账号信息
MySQL 服务端 require_secure_transport 与 phpMyAdmin 的 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; - 若返回
ON且YES,则 phpMyAdmin 对应项必须设$cfg['Servers'][$i]['ssl_mode'] = 'VERIFY_IDENTITY',并确保ssl_ca可读、内容有效 - 若某台 MySQL 是
DISABLED(如本地测试库),则对应$cfg['Servers'][$i]['ssl']必须为false,否则连接会卡在 SSL 握手超时 - 临时关闭强制要求(仅限非生产环境):
SET PERSIST require_secure_transport = OFF;(需 SUPER 权限)
pdo_mysql 连接底层依赖 DSN 显式参数
phpMyAdmin 5.2 默认用 pdo_mysql 扩展,而它不读取 $cfg['Servers'][$i] 中的 ssl_* 键——这些只是给界面提示用的。真实连接靠的是 DSN 字符串里拼出的 sslmode 和证书路径。
因此,你还得补上这个关键配置(放在 $cfg['Servers'][$i] 同级):
if (!empty($cfg['Servers'][$i]['ssl'])) {
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['extension'] = 'mysqli';
// 强制 PDO 使用 SSL 参数
$cfg['Servers'][$i]['ssl_options'] = [
'sslmode' => 'verify-full',
'sslcert' => $cfg['Servers'][$i]['ssl_cert'],
'sslkey' => $cfg['Servers'][$i]['ssl_key'],
'sslca' => $cfg['Servers'][$i]['ssl_ca'],
];
}
注意:sslmode = verify-full 对应 phpMyAdmin 的 VERIFY_IDENTITY;若设 required,某些旧版 OpenSSL 会拒绝握手。
最易被忽略的一点:证书路径必须是 PHP 进程能读取的绝对路径,且 www-data 或 nginx 用户要有权限。用 sudo -u www-data ls -l /path/to/ca.pem 验证,别信配置文件里写的“看起来对”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











