一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何通过SSL/TLS加密MySQL客户端与服务端的连接?

时间:2026-08-10 17:33:50 编辑:袖梨 来源:一聚教程网

必须先确认have_ssl= YES,否则服务端未加载TLS栈,后续配置全无效;再验证ssl_ca/cert/key为非空绝对路径且权限600;最后启用require_secure_transport=ON并客户端显式指定--ssl-mode=REQUIRED。

确认 MySQL 是否真正加载了 SSL 支持

没这一步,后面全白搭。have_ssl 必须返回 YES,否则服务端压根没启用 TLS 栈。常见错误是返回 DISABLED 或空值——这不是证书配错了,而是 mysqld 启动时根本没加载 OpenSSL 模块。

  1. 执行 SHOW VARIABLES LIKE 'have_ssl';,结果不是 YES 就别往下试
  2. SHOW VARIABLES LIKE 'ssl_ca';ssl_certssl_key 三者必须都显示非空的绝对路径(如 /var/lib/mysql/ca.pem
  3. 如果 have_ssl = DISABLED,大概率是用了精简版 MariaDB 或编译时未带 -DWITH_SSL=system;重装最新 MySQL 二进制包比调试证书路径更高效
  4. 顺手查 SELECT @@GLOBAL.tls_version;,确保至少包含 TLSv1.2;若为空,说明底层 TLS 实现未就绪

生成并放置证书:路径、权限、格式缺一不可

MySQL 对证书极其挑剔,错一个细节就会静默跳过 SSL 初始化,连接照常建立但全程明文。

  1. 优先用内置工具:mysql_ssl_rsa_setup --datadir=/var/lib/mysql --uid=mysql,它自动处理 subjectAltName,避免连 IP 时因 CN 不匹配报 X509_V_ERR_IP_ADDRESS_MISMATCH
  2. 证书必须放在 MySQL 进程有读权限的目录(如 /var/lib/mysql/),不能放 /root//home//tmp/
  3. server-key.pem 权限必须是 600-rw-------),且属主为 mysql:执行 chown mysql:mysql /var/lib/mysql/server-key.pem && chmod 600 /var/lib/mysql/server-key.pem
  4. 路径必须是绝对路径,写成 ./ca.pem~/ca.pem 会被 mysqld 静默忽略

配置 require_secure_transport = ON 强制全局加密

只给用户加 REQUIRE SSL 不够——它只校验已建立的连接是否走 TLS;而 require_secure_transport = ON 是协议层开关,会直接拒绝所有未加密的 TCP 连接(包括 [email protected]),这才是真正的强制。

  1. 运行时启用(推荐):SET PERSIST require_secure_transport = ON;
  2. 配置文件启用:在 my.cnf[mysqld] 段添加 require_secure_transport = ON,然后 systemctl restart mysqld
  3. 验证:SELECT @@GLOBAL.require_secure_transport; 返回 1 才算生效
  4. 注意:Unix socket 连接(如本地 localhost)默认不受影响,除非显式禁用

客户端必须显式发起 TLS 握手才能成功连接

服务端开了强制加密,客户端不主动握手,连接会被直接终止。错误提示常是 Access denied for user,但这不是密码错,而是协议被拦在门外。

  1. 命令行:mysql -u appuser -h 192.168.1.100 -p --ssl-mode=REQUIRED
  2. JDBC URL:?useSSL=true&requireSSL=true&enabledTLSProtocols=TLSv1.2(旧驱动用 usessl=true 无效)
  3. PHP mysqli:连接时传入 MYSQLI_CLIENT_SSL 标志
  4. PDO DSN:sslmode=require 或完整指定证书路径
  5. 避坑:--ssl-mode=VERIFY_IDENTITY 要求证书 CN 匹配连接地址,自签名证书 CN 多为 localhost,连 IP 就失败

最容易被忽略的是三者必须同时成立:have_ssl = YES、用户权限含 REQUIRE SSL、客户端真实完成 TLS 握手。漏掉任意一环,连接都会静默降级为明文——你不会收到任何错误,但数据已在裸奔。

热门栏目