phpMyAdmin 不参与 TLS 协议协商,禁用 TLS 1.0/1.1 必须在 Nginx 或 Apache 等 Web 服务器层面配置,因其仅作为 PHP 应用运行于服务器之上,不监听端口也不处理 SSL/TLS 握手;修改其 config.inc.php 完全无效。
phpmyadmin 本身不处理 tls 协议协商,禁用 tls 1.0/1.1 必须在它所依赖的 web 服务器(nginx 或 apache)层面完成——改 phpmyadmin 配置文件无效。
为什么不能在 phpMyAdmin 配置里禁用 TLS
phpMyAdmin 是一个 PHP 应用,运行在 Web 服务器之上。它不直接监听 HTTPS 端口,也不参与 SSL/TLS 握手过程。所有加密协议版本的选择、密钥交换、证书验证,都由底层 Web 服务器(如 nginx 或 httpd)和 OpenSSL 库控制。修改 config.inc.php 中的任何选项,比如 $cfg['ForceSSL'] 或 $cfg['Servers'][$i]['ssl'],只影响 phpMyAdmin 自身的重定向或连接行为,**完全不影响 TLS 协议版本协商**。
Nginx 用户:每个 server 块必须单独加 ssl_protocols
如果你用 Nginx 托管 phpMyAdmin(例如通过 location 转发到 PHP-FPM),禁用旧协议的关键动作是:在**实际监听 443 端口并启用 SSL 的 server 块**中写死协议列表。
-
ssl_protocols TLSv1.2 TLSv1.3;—— 必须精确写出这两个版本,不能多也不能少 - 不能放在
http或location块里,否则不生效 - 如果 phpMyAdmin 和主站共用一个域名但用了不同 server 块(比如泛域名或 SNI 分离),每个
server都得配这一行 - 常见坑:只改了主站配置,却漏掉专门代理 phpMyAdmin 的那个
server(如phpmyadmin.example.com)
Apache 用户:在 VirtualHost 内用 SSLProtocol 显式剔除
Apache 下托管 phpMyAdmin 通常有两种方式:子目录(如 /phpmyadmin)或独立虚拟主机。无论哪种,安全策略都必须落在 <virtualhost></virtualhost> 块内:
- 推荐写法:
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 - 避免只写
SSLProtocol TLSv1.2 TLSv1.3—— 某些旧版 Apache 解析不一致,显式排除更可靠 - 必须同步设置:
SSLCipherSuite(禁用 RC4、3DES、MD5、SHA1)、SSLHonorCipherOrder on - 若 phpMyAdmin 是子目录,也要确认其所在
<virtualhost></virtualhost>已正确配置,而不是仅靠 .htaccess
验证时别被 phpMyAdmin 页面误导
浏览器打开 phpMyAdmin 页面显示 “HTTPS” 并不等于 TLS 1.2+ 已生效。真正要测的是底层握手行为:
立即学习“PHP免费学习笔记(深入)”;
- 用命令行实测:
openssl s_client -connect your-domain.com:443 -tls1_1 -servername your-domain.com→ 应返回no protocols available或握手失败 - 用
openssl s_client -connect ... -tls1_2确认 TLS 1.2 连接仍通 - 在线工具如 SSL Labs 测试结果里的 “Handshake Simulation” 表格,比 phpMyAdmin 自身的界面反馈更可信
- 特别注意:某些 CDN(如 Cloudflare)会终止 TLS 并重连,此时需测试源站 IP 直连,否则看到的是 CDN 的协议设置



















