phpmyadmin本身不管理ssl证书,https由web服务器配置,mysql加密连接需mysql服务端和phpmyadmin的config.inc.php分别配置:web服务器配tls加密浏览器到phpmyadmin链路;mysql服务端通过my.cnf启用ssl并设require_secure_transport=on强制加密;phpmyadmin需在config.inc.php中显式配置ssl_ca、ssl_cert、ssl_key指向php进程可读的客户端证书路径。
phpmyadmin 本身不管理 ssl 证书——它只是个 php 应用,https 要靠 web 服务器(nginx/apache)配,mysql 加密连接要靠 mysql 服务端和 phpmyadmin 的 config.inc.php 分别配。三者 ssl 各管一摊,混在一起就全连不上。
Web 服务器配 HTTPS:让浏览器到 phpMyAdmin 的链路加密
这是最常被当成“给 phpMyAdmin 配 SSL”的动作,实际是给整个网站加 TLS:
- 证书文件(
server.crt和server.key)必须放在 Web 服务器进程可读的路径,比如/etc/ssl/private/phpmyadmin.key,权限设为640,属主为www-data或nginx - Nginx 配置里
ssl_certificate和ssl_certificate_key必须指向绝对路径,不能用相对路径或符号链接(某些版本会静默失败) - 别漏掉
ssl_protocols TLSv1.2 TLSv1.3;——禁用 TLSv1.0/v1.1 是硬性安全要求,不是可选项 - 启用 HSTS(
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;)后,浏览器会强制跳转 HTTPS,但首次访问仍需手动输 https://,否则 80 端口请求会被直接拒掉
MySQL 服务端配 SSL:让 phpMyAdmin 到数据库的链路加密
光 Web 层 HTTPS 没用,数据库密码和查询内容仍是明文。MySQL 必须自己启用并强制 SSL:
- 检查是否支持:
SHOW VARIABLES LIKE 'have_ssl';返回YES才能继续;若为DISABLED,得换带 OpenSSL 支持的 MySQL 包,phpEnv 默认版大概率不支持 -
my.cnf的[mysqld]段必须写死绝对路径:ssl_ca = /etc/mysql/ca.pem、ssl_cert = /etc/mysql/server-cert.pem、ssl_key = /etc/mysql/server-key.pem,且 MySQL 进程用户(如mysql)要有读权限 - 关键项
require_secure_transport = ON必须加,否则客户端即使带证书也会被允许走明文——很多连不上就是因为这行漏了 - 改完必须
systemctl restart mysqld(不是reload),SSL 配置不热加载 - 验证是否真生效:
SHOW STATUS LIKE 'Ssl_cipher';返回非空值才算当前连接已加密,SHOW VARIABLES LIKE '%ssl%'只说明“能用”,不代表“正在用”
phpMyAdmin config.inc.php 配客户端证书:告诉它怎么连加密的 MySQL
MySQL 开了 REQUIRE SSL,phpMyAdmin 默认不发证书,直接被拒,报错却显示 Access denied for user 'xxx'@'%' (using password: YES),完全不提 SSL,极易误判为密码错:
- 在
$cfg['Servers'][$i]['ssl'] = true;后,必须显式填三项:$cfg['Servers'][$i]['ssl_ca']、$cfg['Servers'][$i]['ssl_cert']、$cfg['Servers'][$i]['ssl_key'],路径是 PHP 进程(如www-data)能读的绝对路径,不是浏览器能访问的 URL -
ssl_cert和ssl_key必须配对,且私钥不能设密码——PHP 的 MySQLi/PDO 不支持交互式解密,带密码的 key 会导致连接卡住或报SSL connection error: protocol error - 自签名 CA 下可临时关校验:
$cfg['Servers'][$i]['ssl_verify'] = false;,但仅限内网测试;生产环境必须配对正确、CN/SAN 匹配,否则握手失败 - 证书得含
X509v3 Extended Key Usage: TLS Web Client Authentication,用openssl x509 -in client-cert.pem -text -noout查,缺这个字段客户端证书无效
常见错误:OpenSSL 握手失败但报错笼统
看到 Unknown SSL error 或 SSL connection error: protocol error,基本不是 phpMyAdmin 代码问题,而是底层 OpenSSL 握手卡在某一步:
- 先确认 MySQL 服务端
require_secure_transport = ON是否生效,再查 phpMyAdmin 是否真传了证书(看 MySQL 的SHOW PROCESSLIST里连接的ssl_type字段) - 检查证书链完整性:CA 证书、服务端证书、客户端证书是否都用了同一套根 CA 签发;交叉签发或中间 CA 缺失都会导致握手中断
- OpenSSL 版本 mismatch:MySQL 用 OpenSSL 3.x 生成的证书,PHP 7.4 用的 OpenSSL 1.1.1 可能无法识别某些扩展字段,降级生成或升级 PHP
- 时间不同步:服务器间系统时间差超 5 分钟,TLS 握手直接失败,
date命令核对所有机器时间
真正麻烦的从来不是配哪一行,而是三处 SSL 各自生效却不联动:Web 层 HTTPS 正常,MySQL 层 SSL 未强制,phpMyAdmin 层证书路径错位——结果就是登录成功但所有查询走明文,还自以为安全了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











