MySQL配置SSL加密访问的实现步骤

 更新时间:2026年03月03日 10:05:50   作者:遇见火星  
本文主要介绍了MySQL配置SSL加密访问,包括自建证书和CA签发证书两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

要为MySQL配置SSL加密访问,核心目标是让客户端与MySQL服务端之间的网络传输数据被SSL/TLS加密,防止数据在传输过程中被窃听、篡改或伪造。以下是完整的配置步骤(涵盖自建证书、服务端配置、客户端验证),分为「测试环境(自建自签名证书)」和「生产环境(CA签发证书)」两种场景。

这里着重讲解自建方案,个人感觉自建方案可操作性强,CA签发证书一年需要更新一次,对于数据库来讲谁也受不了。

一、前提说明

 MySQL版本要求:5.7及以上默认支持SSL,8.0+内置简易证书生成工具(推荐使用);

 核心逻辑:MySQL通过SSL证书完成服务端/客户端身份验证,同时加密传输数据;

 证书类型:

  •  自签名证书:适合测试/内网环境,无需CA认证,但客户端需信任该证书;
  •  CA签发证书:适合生产环境,安全性更高,需向可信CA申请证书。

二、步骤1:生成SSL证书(自建自签名,测试环境)

方式1:MySQL内置工具自动生成(推荐,8.0+)

MySQL 8.0+提供mysql_ssl_rsa_setup工具,可一键生成自签名SSL证书:

# 1. 进入MySQL数据目录(需确认目录权限,通常为/var/lib/mysql/)
cd /var/lib/mysql
chown mysql:mysql .  # 确保mysql用户有读写权限
 
# 2. 生成SSL证书(--datadir指定证书存放目录)
mysql_ssl_rsa_setup --datadir=/var/lib/mysql --uid=mysql
 
# 3. 查看生成的证书文件(关键文件如下)
ls -l /var/lib/mysql/*.pem
# 核心文件说明:
# ca.pem          → CA根证书(客户端需信任)
# server-cert.pem → 服务端证书
# server-key.pem  → 服务端私钥
# client-cert.pem → 客户端证书
# client-key.pem  → 客户端私钥

方式2:手动生成(适配5.7+/8.0,通用)

mysql_ssl_rsa_setup不可用,用openssl手动生成:

# 1. 创建证书目录(建议与MySQL数据目录分离)
mkdir -p /etc/mysql/ssl
chown mysql:mysql /etc/mysql/ssl
cd /etc/mysql/ssl
 
# 2. 生成CA根证书(有效期10年)
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3650 -key ca-key.pem > ca.pem
 
# 3. 生成服务端证书(填写信息时,Common Name需为MySQL服务端IP/域名)
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem > server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
 
# 4. 生成客户端证书(Common Name可任意,建议区分服务端)
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 02 > client-cert.pem
 
# 5. 调整权限(仅mysql用户可读写,防止私钥泄露)
chmod 600 *.pem
chown mysql:mysql *.pem

三、步骤2:配置MySQL服务端启用SSL

1. 修改MySQL配置文件

编辑MySQL配置文件(Linux:/etc/my.cnf//etc/mysql/my.cnf;Windows:my.ini),添加以下配置:

[mysqld]
# 启用SSL(强制服务端使用SSL)
ssl=ON
# 指定证书路径(根据实际生成路径修改)
ssl-ca=/var/lib/mysql/ca.pem          # CA根证书
ssl-cert=/var/lib/mysql/server-cert.pem  # 服务端证书
ssl-key=/var/lib/mysql/server-key.pem    # 服务端私钥
 
# 可选:强制所有客户端连接必须使用SSL(生产环境建议开启)
# require_secure_transport=ON
 
# 可选:指定SSL协议版本(避免老旧协议,生产环境建议)
tls_version=TLSv1.2,TLSv1.3

2. 重启MySQL服务

# Linux(Systemd)
systemctl restart mysqld
 
# Linux(SysV)
service mysqld restart
 
# Windows
net stop mysql && net start mysql

3. 验证服务端SSL是否启用

登录MySQL服务端,执行以下命令:

-- 查看SSL状态(Ssl_enabled为YES表示启用成功)
SHOW VARIABLES LIKE '%ssl%';
/* 预期输出:
+---------------+---------------------------+
| Variable_name | Value                     |
+---------------+---------------------------+
| have_ssl      | YES                       |
| ssl_ca        | /var/lib/mysql/ca.pem     |
| ssl_cert      | /var/lib/mysql/server-cert.pem |
| ssl_key       | /var/lib/mysql/server-key.pem   |
+---------------+---------------------------+
*/

四、步骤3:配置客户端SSL连接

场景1:客户端连接时手动指定SSL(非强制)

客户端连接MySQL时,通过参数指定SSL证书,实现加密连接:

# MySQL客户端命令行连接(替换为你的IP/端口/用户名)
mysql -h 192.168.1.100 -P 3306 -u root -p \
  --ssl-mode=REQUIRED \
  --ssl-ca=/var/lib/mysql/ca.pem \
  --ssl-cert=/var/lib/mysql/client-cert.pem \
  --ssl-key=/var/lib/mysql/client-key.pem

参数说明:

  •  --ssl-mode=REQUIRED:强制使用SSL连接,无SSL则拒绝(可选值:DISABLED/REQUIRED/VERIFY_CA/VERIFY_IDENTITY);
  •  --ssl-ca:指定CA根证书(验证服务端证书合法性);
  •  --ssl-cert/--ssl-key:客户端证书/私钥(服务端验证客户端身份时需用)。

场景2:授权用户必须使用SSL连接(生产环境)

为MySQL用户配置“仅允许SSL加密连接”,防止明文连接:

-- 授权root用户仅能通过SSL从任意主机访问(替换为你的用户/IP)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的密码' REQUIRE SSL;
 
-- 刷新权限
FLUSH PRIVILEGES;
 
-- 查看用户的SSL权限(Ssl_type为SSL表示强制)
SELECT user, host, ssl_type FROM mysql.user WHERE user='root';

场景3:客户端配置文件持久化SSL(无需每次输参数)

编辑客户端~/.my.cnf(Linux)或%APPDATA%\MySQL\.my.cnf(Windows):

[client]
host=192.168.1.100
port=3306
user=root
password=你的密码
ssl-mode=REQUIRED
ssl-ca=/var/lib/mysql/ca.pem
ssl-cert=/var/lib/mysql/client-cert.pem
ssl-key=/var/lib/mysql/client-key.pem

之后直接执行mysql即可自动使用SSL连接。

五、步骤4:验证SSL加密是否生效

1. 客户端验证连接状态

登录MySQL后,执行以下命令:

-- 查看当前连接的SSL状态(Ssl_cipher非空表示加密生效)
SHOW STATUS LIKE 'Ssl_cipher';
/* 预期输出:
+---------------+-----------------------------+
| Variable_name | Value                       |
+---------------+-----------------------------+
| Ssl_cipher    | TLS_AES_256_GCM_SHA384      |
+---------------+-----------------------------+
*/

2. 网络层面验证(可选)

tcpdump/wireshark抓包,查看MySQL端口(3306)的流量:

  •  未加密:能看到明文的SQL语句(如SELECT * FROM user);
  •  已加密:流量为乱码,无明文SQL。

六、关键注意事项

 生产环境建议

  •  不要使用自签名证书,改用Let’s Encrypt等可信CA签发的证书;
  •  启用require_secure_transport=ON,强制所有连接使用SSL;
  •  限制SSL协议版本为TLSv1.2+,禁用TLSv1.0/TLSv1.1(老旧协议有安全漏洞)。

2. 权限安全

  •  证书文件(尤其是私钥.pem)必须仅对mysql用户可读写(权限600),防止泄露;
  •  客户端证书不要随意外传,仅分发给可信客户端。

3. 性能影响

  •  SSL加密会增加少量CPU开销(约5%-10%),高并发场景可通过硬件加速优化;
  •  若内网环境已做网络隔离,可仅对跨公网的连接启用SSL。

4. 常见问题

  •  连接失败提示SSL connection error:检查证书路径/权限、MySQL服务端SSL是否启用;
  •  客户端验证失败:确保CA证书一致,服务端/客户端证书的Common Name匹配;
  •  MySQL 5.7以下:需手动编译启用SSL,建议升级到5.7+。

到此这篇关于MySQL配置SSL加密访问的实现步骤的文章就介绍到这了,更多相关MySQL配置SSL加密访问内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • MySql数据库中的子查询与高级应用浅析

    MySql数据库中的子查询与高级应用浅析

    这篇文章主要给大家介绍了关于MySql数据库中子查询与高级应用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • Linux下指定mysql数据库数据配置主主同步的实例

    Linux下指定mysql数据库数据配置主主同步的实例

    Linux下指定数据库数据配置主主同步的实例,有需要的朋友可以参考下
    2013-01-01
  • MySQL下海量数据的迁移步骤分享

    MySQL下海量数据的迁移步骤分享

    一般mysql小数据的情况可以通过直接复制目录,或者通过帝国备份工具,如果是海量数据(6亿)该怎么处理呢,下面看下别人是怎么处理的参考一下
    2013-10-10
  • Mysql 5.7.17 解压版(ZIP版)安装步骤详解

    Mysql 5.7.17 解压版(ZIP版)安装步骤详解

    MySQL 社区版 5.7.17 发布了,MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下产品,是最流行的关系型数据库管理系统。下面这篇文章主要介绍了Mysql 5.7.17 解压版的安装步骤,并且介绍了可能会遇到的坑,需要的朋友可以参考下。
    2017-01-01
  • MySQL 配置文件 my.cnf / my.ini 区别解析

    MySQL 配置文件 my.cnf / my.ini 区别解析

    充分理解 MySQL 配置文件中各个变量的意义对我们有针对性的优化 MySQL 数据库性能有非常大的意义,这篇文章主要介绍了MySQL 配置文件 my.cnf / my.ini 区别,需要的朋友可以参考下
    2022-11-11
  • 解决MySQL 8.0以上版本设置大小写不敏感的问题

    解决MySQL 8.0以上版本设置大小写不敏感的问题

    MySQL 8.0以上版本默认区分大小写,但在低版本(如5.7)中,可以通过在my.cnf配置文件的[mysqld]节下添加lower_case_table_names=1来设置大小写不敏感,本篇博客将介绍如何解决MySQL 8.0以上版本设置大小写不敏感的问题,需要的朋友可以参考下
    2023-11-11
  • MySQL中delimiter关键字的使用解读

    MySQL中delimiter关键字的使用解读

    这篇文章主要介绍了MySQL中delimiter关键字的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • mysql8.0 JSON_CONTAINS的使用说明

    mysql8.0 JSON_CONTAINS的使用说明

    这篇文章主要介绍了mysql8.0 JSON_CONTAINS的使用说明,具有很好的参考价值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 详解MySQL如何有效的存储IP地址及字符串IP和数值之间如何转换

    详解MySQL如何有效的存储IP地址及字符串IP和数值之间如何转换

    本文主要介绍了MySQL如何有效的存储IP地址及字符串IP和数值之间如何转换,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • MySQL数据库自连接实例讲解

    MySQL数据库自连接实例讲解

    针对相同的表进行的连接被称为"自连接"(self join),下面这篇文章主要给大家介绍了关于MySQL数据库自连接实例讲解的相关资料,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06

最新评论