必须先确认have_ssl= YES,否则服务端未加载TLS栈,后续配置全无效;再验证ssl_ca/cert/key为非空绝对路径且权限600;最后启用require_secure_transport=ON并客户端显式指定--ssl-mode=REQUIRED。
没这一步,后面全白搭。have_ssl 必须返回 YES,否则服务端压根没启用 TLS 栈。常见错误是返回 DISABLED 或空值——这不是证书配错了,而是 mysqld 启动时根本没加载 OpenSSL 模块。
SHOW VARIABLES LIKE 'have_ssl';,结果不是 YES 就别往下试SHOW VARIABLES LIKE 'ssl_ca';、ssl_cert、ssl_key 三者必须都显示非空的绝对路径(如 /var/lib/mysql/ca.pem)have_ssl = DISABLED,大概率是用了精简版 MariaDB 或编译时未带 -DWITH_SSL=system;重装最新 MySQL 二进制包比调试证书路径更高效SELECT @@GLOBAL.tls_version;,确保至少包含 TLSv1.2;若为空,说明底层 TLS 实现未就绪MySQL 对证书极其挑剔,错一个细节就会静默跳过 SSL 初始化,连接照常建立但全程明文。
mysql_ssl_rsa_setup --datadir=/var/lib/mysql --uid=mysql,它自动处理 subjectAltName,避免连 IP 时因 CN 不匹配报 X509_V_ERR_IP_ADDRESS_MISMATCH
/var/lib/mysql/),不能放 /root/、/home/ 或 /tmp/
server-key.pem 权限必须是 600(-rw-------),且属主为 mysql:执行 chown mysql:mysql /var/lib/mysql/server-key.pem && chmod 600 /var/lib/mysql/server-key.pem
./ca.pem 或 ~/ca.pem 会被 mysqld 静默忽略只给用户加 REQUIRE SSL 不够——它只校验已建立的连接是否走 TLS;而 require_secure_transport = ON 是协议层开关,会直接拒绝所有未加密的 TCP 连接(包括 [email protected]),这才是真正的强制。
SET PERSIST require_secure_transport = ON;
my.cnf 的 [mysqld] 段添加 require_secure_transport = ON,然后 systemctl restart mysqld
SELECT @@GLOBAL.require_secure_transport; 返回 1 才算生效localhost)默认不受影响,除非显式禁用服务端开了强制加密,客户端不主动握手,连接会被直接终止。错误提示常是 Access denied for user,但这不是密码错,而是协议被拦在门外。
mysql -u appuser -h 192.168.1.100 -p --ssl-mode=REQUIRED
?useSSL=true&requireSSL=true&enabledTLSProtocols=TLSv1.2(旧驱动用 usessl=true 无效)MYSQLI_CLIENT_SSL 标志sslmode=require 或完整指定证书路径--ssl-mode=VERIFY_IDENTITY 要求证书 CN 匹配连接地址,自签名证书 CN 多为 localhost,连 IP 就失败最容易被忽略的是三者必须同时成立:have_ssl = YES、用户权限含 REQUIRE SSL、客户端真实完成 TLS 握手。漏掉任意一环,连接都会静默降级为明文——你不会收到任何错误,但数据已在裸奔。