mysql 8.0.16+ 才支持可写tls_version配置以禁用tlsv1.0;8.0.16–8.27需手动设tls_version=tlsv1.2,tlsv1.3(无空格)并重启生效;8.0.28+已硬性移除tlsv1.0/tlsv1.1,配置中指定亦被忽略。

tls_version 配置项在 MySQL 8.0.16+ 才真正可写且生效;低于该版本设了也无效,SHOW VARIABLES LIKE 'tls_version' 返回只读值,不能禁用 TLSv1.0。
MySQL 8.0.16–8.0.27:用 tls_version 显式排除 TLSv1.0
这个区间内,MySQL 支持配置但尚未强制移除旧协议。必须手动指定允许的协议列表,**不包含 TLSv1.0 即表示禁用**:
- 编辑
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段添加:
tls_version = TLSv1.2,TLSv1.3
注意:tls_version 值是逗号分隔、无空格的字符串;含空格或非法协议名(如 TLSv1)会导致 mysqld 启动失败。
- 重启服务生效:
sudo systemctl restart mysql(reload不触发重载) - 验证是否加载成功:
SHOW GLOBAL VARIABLES LIKE 'tls_version'应返回你写的值 - 但仅看这个不够——它只说明“服务端允许哪些”,不等于连接真用了哪个;实际协商结果需查:
STATUS;或SELECT VARIABLE_VALUE FROM performance_schema.status_by_thread WHERE VARIABLE_NAME = 'Ssl_version' AND THREAD_ID = CONNECTION_ID();
MySQL 8.0.28+:TLSv1.0 已硬性移除,配了也忽略
从 8.0.28 开始,MySQL 彻底删除对 TLSv1 和 TLSv1.1 的支持代码。即使你在配置里写 tls_version = TLSv1.0,TLSv1.2,启动时会静默丢弃 TLSv1.0,SHOW GLOBAL VARIABLES 仍只显示 TLSv1.2,TLSv1.3。
- 无需额外操作即可“禁用” TLSv1.0 —— 它根本不存在于协议栈中
- 但客户端若只支持 TLSv1.0(极老旧 Java 7 / OpenSSL 1.0.x),连接会直接报错:
SSL connection error: Unsupported protocol,这不是配置问题,而是协议不可用 - 此时必须升级客户端 TLS 栈,或降级 MySQL(不推荐)
为什么设了 tls_version 还连不上?常见握手失败原因
典型现象是客户端报 SSL handshake failed 或 Unsupported protocol,而非证书错误。这说明协商卡在协议层,和证书内容无关。
- 客户端 OpenSSL 版本太低(如 TLSv1.3 就会失败
- 系统级 OpenSSL 配置覆盖(如
/etc/ssl/openssl.cnf中MinProtocol = TLSv1.2)→ 会压倒 MySQL 的tls_version设置 - MySQL 客户端工具(如 mysql CLI)未显式启用加密:
--ssl-mode=REQUIRED缺失 → 连接走明文,STATUS显示SSL: Not in use -
require_secure_transport = ON已开启,但用户没设REQUIRE SSL→ 服务端拒绝非加密连接,但错误提示容易被误读为协议问题
真正起作用的是「MySQL 版本 + tls_version 配置 + 客户端 TLS 栈能力」三者交集;单独改一个地方,往往看不出效果。最容易被忽略的是:MySQL 启动后必须重启,且客户端连接命令要带 --ssl-mode,否则一切配置都只是纸上谈兵。











