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

云枫君_5397

云枫君_5397

2026-08-09

306人浏览

原创

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

如何通过ssl/tls加密mysql客户端与服务端的连接?

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

没这一步,后面全白搭。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
  • 证书必须放在 MySQL 进程有读权限的目录(如 /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_secure_transport = ON 强制全局加密

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

SSL
SSL

配置HTTPS,管理TLS证书,并调试安全连接问题。

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

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

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

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

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

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

1973

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1219

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

715

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2592

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4268

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1019

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4531

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4082

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5274

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 176人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 279人学习