MySQL服务端必须先启用SSL并强制加密,否则phpMyAdmin无法连接;需在my.cnf[mysqld]中配置require_secure_transport=ON、ssl_ca/ssl_cert/ssl_key绝对路径且MySQL进程可读,重启mysqld后验证Ssl_cipher非空,phpMyAdmin config.inc.php还需显式配置客户端证书路径。
MySQL服务端必须先启用SSL并强制加密
phpmyadmin只是客户端,它连不上,90% 的原因是 mysql 根本没真正启用 ssl。光配证书路径不等于生效。require_secure_transport = on 必须加在 my.cnf 的 [mysqld] 段里,否则客户端即使带证书也会被允许走明文。
-
ssl_ca、ssl_cert、ssl_key必须是绝对路径,且 MySQL 进程(如mysql用户)能读取——放/root/或权限为 644 的私钥都会静默失败 - 改完必须
systemctl restart mysqld(不是reload),SSL 配置不支持热加载 - 验证是否真生效,别只看
SHOW VARIABLES LIKE '%ssl%';执行SHOW STATUS LIKE 'Ssl_cipher',返回非空值才算当前连接已加密
phpMyAdmin config.inc.php 必须显式填入客户端证书路径
就算 MySQL 开了 REQUIRE SSL,phpMyAdmin 默认也不传任何证书——它会直接被拒,报错却显示 Access denied for user 'xxx'@'%' (using password: YES),完全不提 SSL,极具误导性。
- 在
$cfg['Servers'][$i]['ssl'] = true;后追加三项:$cfg['Servers'][$i]['ssl_ca'] = '/etc/mysql/ca.pem';、$cfg['Servers'][$i]['ssl_cert'] = '/etc/mysql/client-cert.pem';、$cfg['Servers'][$i]['ssl_key'] = '/etc/mysql/client-key.pem'; - 路径必须是 phpMyAdmin 所在服务器上 PHP 进程(如
www-data)能读的绝对路径,不是浏览器可访问路径 -
ssl_cert和ssl_key必须配对,且私钥不能设密码(PHP 的 MySQLi/PDO 不支持交互式解密) - 若用自签名 CA,可临时设
$cfg['Servers'][$i]['ssl_verify'] = false;避免 CN/SAN 校验失败,但仅限内网测试
远程连接配置中 host 和 port 别写错
$cfg['Servers'][$i]['host'] 填远程服务器的公网/内网 IP,别用 localhost 或 127.0.0.1——那会让请求发到 phpMyAdmin 所在机器的本地 MySQL。
- 如果远程 MySQL 启用了 SSL,必须加
$cfg['Servers'][$i]['ssl'] = true;,否则连接会静默失败(无明确错误) - 若远程 MySQL 改了端口(比如
3307),一定要同步设$cfg['Servers'][$i]['port'] = '3307';,否则仍连默认3306 - 不建议开启
$cfg['Servers'][$i]['auth_type'] = 'config'存密码明文,尤其在共享环境;用cookie或http更稳妥
OpenSSL 握手失败时别只查 phpMyAdmin
连不上时看到 Unknown SSL error 或 SSL connection error: protocol error,基本不是 phpMyAdmin 的问题,而是底层 OpenSSL 握手卡住了。
- 用
openssl x509 -in /path/to/client-cert.pem -text -noout检查证书是否含X509v3 Extended Key Usage: TLS Web Client Authentication - 确认客户端证书和私钥文件权限为 600,且属主是 PHP 进程运行用户(如
www-data) - MySQL 服务端证书需包含
TLS Web Server Authentication扩展用途,否则握手会拒绝



















