第九十三期 MySQL8 启用强制SSL

发布于 2025-07-17  316 次阅读


一、SSL证书准备

在开始前,首先确保环境已经安装了openssl以及libssl-dev
需要生成一个CA证书,一套服务端加密使用的公钥和私钥,一套客户端传输数据加密使用的公钥和私钥

1. 生成CA证书

openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.pem -subj "/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/OU=IT Dept/CN=MyRootCA"

其中days 参数则意味着证书的有效期限天数,不建议太长,如果是生产环境或者懒得维护,你可以把它设高一点。

这样就成功生成了CA证书,其中ca.key用于签发下属证书认证用途。
你的服务端和客户端的密钥都需要由同一个CA证书签发!

2. 生成服务端公钥私钥

2.1 创建服务端密钥

2.1.1 创建server_ext.cnf文件

vim server_ext.cnf

填写如下内容

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
IP.1 = 127.0.0.1

2.1.2 请注意,DNS.1 和 IP.1都是你服务器本机的地址,如果你有很多域名和公网IP,你可以继续如以下所示追加

DNS.2 = dev.test.com
IP.2 = 192.168.1.1

不正确的server_ext,尤其是alt_names部分的配置,将导致CA无效!

2.2 生成公钥私钥

openssl x509 -req -in server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.pem -days 36500 -sha256 -extfile server_ext.cnf

其中days 参数则意味着证书的有效期限天数,不建议太长,如果是生产环境或者懒得维护,你可以把它设高一点。

3.1 创建客户端密钥

3.1.1 创建client_ext文件

vim client_ext.cnf

填写如下内容

basicConstraints=CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth

3.2 生成公钥私钥

openssl x509 -req -in client.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out client.pem -days 36500 -sha256 -extfile client_ext.cnf

4. 将密钥迁移至你认为规范、安全的文件夹,并为他们修改权限。
4.1 移动密钥

mv *.pem 你希望的路径
mv client.key 你希望的路径
mv server.key 你希望的路径

4.2 修改拥有者与权限

chown mysql:mysql 你希望的路径/server.pem
chown mysql:mysql 你希望的路径/server.key
chmod 600 你希望的路径/server.pem
chmod 600 你希望的路径/server.key

⚠ 错误的权限或路径将导致认证失败或报错。

二、配置文件修改

1 在修改配置文件之前,你应该了解需要修改什么文件,但是你也应该知道默认的配置文件在哪里
可能是/etc/my.cnf 也可能是 /etc/mysql/my.cnf,也有可能 /var/lib/mysql里头但几乎不可能,Windows上的mysql只有你自己清楚了。
1.1 cat命令查看

cat /etc/mysql/my.cnf

如果没有看到!includedir 那说明你可以直接在my.cnf里写配置文件,否则你就要去找带有[mysqld]段落的文件,去修改那个文件。
注意 不是[mysql]段落!
我这里提示

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

检查之后/etc/mysql/mysql.conf.d/mysql.cnf才是需要修改的文件

2. 修改或覆盖配置文件

vim /etc/mysql/mysql.conf.d/mysql.cnf

需要在[mysqld]段落下方追加

ssl-ca=你放公钥私钥的路径/ca.pem
ssl-cert=你放公钥私钥的路径/server.pem
ssl-key=你放公钥私钥的路径/server.key
require_secure_transport=ON

三、登录MySQL控制台修改权限

MySQL语句如下

-- 查看当前所有用户
SELECT user, host, ssl_type FROM mysql.user;

-- 修改用户为强制 SSL(举例 root 用户)
ALTER USER 'root'@'%' REQUIRE SSL;

-- 如果你有多个用户,也可以批量生成命令
SELECT CONCAT('ALTER USER ''', user, '''@''', host, ''' REQUIRE SSL;')
FROM mysql.user
WHERE ssl_type != 'ANY';

四、重启MySQL

* 我不知道你的进程守护或者service名字是mysqld还是mysql, Windows如果注册了service应该在services.msc里重启服务。

systemctl restart mysql

登录命令

mysql -u root -p --ssl-ca=你放公钥私钥的路径/ca.pem --ssl-cert=你放公钥私钥的路径/client.pem --ssl-key=你放公钥私钥的路径/client.key

如果你不启用客户端加密,ssl-cert和ssl-key参数可以缺省。


Skyler & Harry 's Notes