必须设为 ON 才能强制新连接走 TLS,require_secure_transport=ON 是 MySQL 5.7.19+ 唯一生效方式,需配合有效 TLS 证书且仅在 [mysqld] 段配置,动态设置仅影响后续连接。

必须设为 ON,否则无法真正强制所有新连接走 TLS
require_secure_transport=ON 是唯一生效方式
这个参数是 MySQL 5.7.19+ 引入的全局布尔开关,OFF(默认)或 0 都等同于“不强制”。只有显式设为 ON 或 1 才会拒绝非加密连接。
- 设成
require_secure_transport=1和require_secure_transport=ON效果完全一样 - 设成
require_secure_transport=TRUE会被 MySQL 当作语法错误,直接启动失败 - 动态设置
SET GLOBAL require_secure_transport = ON仅对后续新连接生效,已有连接不受影响 - 必须配合服务端已配置有效的 TLS 证书(
ssl_ca、ssl_cert、ssl_key),否则客户端连不上会报错:SSL connection error: protocol version mismatch或更常见的Access denied for user ... (using password: YES)(其实是 TLS 握手失败后被拒)
my.cnf 里配错位置会导致不生效
该参数只能在 [mysqld] 段落下设置,写在 [client] 或 [mysql] 下完全无效。
- 正确写法:
[mysqld] require_secure_transport = ON ssl_ca = /etc/mysql/ssl/ca.pem ssl_cert = /etc/mysql/ssl/server-cert.pem ssl_key = /etc/mysql/ssl/server-key.pem
- 重启 MySQL 后用
SELECT @@require_secure_transport;确认返回1 - 如果只改了配置但没重启,或重启失败(比如证书路径错、权限不对),MySQL 会静默忽略 TLS 配置,
require_secure_transport仍为OFF
客户端连不上?先看错误信息里有没有 SSL 关键词
强制 TLS 后最常遇到的不是配置问题,而是客户端没适配。错误提示往往不直说“缺 TLS”,得盯住关键字段:
-
ERROR 2026 (HY000): SSL connection error: protocol version mismatch→ 服务端和客户端支持的 TLS 版本不兼容(如服务端只开 TLSv1.2,客户端用老版 MySQL Connector) -
ERROR 1045 (28000): Access denied for user ... (using password: YES)→ 典型 TLS 握手失败后的兜底拒绝,优先检查SHOW VARIABLES LIKE 'have_ssl';是否为YES,再查证书文件权限是否为mysql用户可读 - Java 客户端要加
?useSSL=true&requireSSL=true;Python 的pymysql需显式传ssl={'ca':...},光设require_secure_transport不会让客户端自动启用 TLS
真正麻烦的是旧应用——它们可能硬编码了 mysql_real_connect() 的 flag,没传 CLIENT_SSL,连握手请求都不发。这种时候不是服务器配得不够狠,而是客户端根本没尝试走 TLS。











