要为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加密访问内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论