一、查看是否开启SSLmysql> show variables like 'have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl | YES |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
#当 have_ssl 为 YES 时, 表示此时 MySQL 服务已经支持 SSL 了. 如果是 DESABLE,证明还没有开启SSL
二、生成证书
使用工具创建证书与私钥(推荐)
在 MySQL 5.7 中, 提供了一个名为 mysql_ssl_rsa_setup 的工具, 通过它, 我们可以很方便地创建 SSL 连接所需要的各种文件:
这个工具在你mysql的安装目录下的bin目录下,如果实在找不到,用以下命令查找下locate -r mysql_ssl_rsa_setup$
#或
find / -name "mysql_ssl_rsa_setup"
进入到mysql_ssl_rsa_setup所在的目录后#需要先停止mysql
systemctl stop mysqld
./mysql_ssl_rsa_setup --uid=mysql
默认会在mysql的datadir下生成8个.pem文件, (datadir可以在 ./mysql_ssl_rsa_setup --help 命令下看到)-v 可以指定证书的生成目录
--uid 指定证书文件的归属用户
生成的八个证书文件ca-key.pem #CA私钥
ca.pem #自签的CA证书,客户端连接也需要提供
client-cert.pem #客户端连接服务器端需要提供的证书文件
client-key.pem #客户端连接服务器端需要提供的私钥文件
private_key.pem #私钥/公钥对的私有成员
public_key.pem #私钥/公钥对的共有成员
server-cert.pem #服务器端证书文件
server-key.pem #服务器端私钥文件
三、服务器端配置SSL(非必须)
在你保证生成的八个证书文件的归属用户和权限均设置正确的情况下来说,重启下mysql服务,mysql会自动开启SSL,下面操作只针对为自动加载证书,开启SSL的情况.
在mysql的配置文件下添加以下内容(注意需要添加到[mysqld]下)[mysqld]
ssl-ca = path/ca.pem
ssl-cert = path/server-cert.pem
ssl-key = path/server-key.pem
四、验证
在你改完配置之后一定要重启或重新加载下配置mysql -u tom --ssl-mode=required -p
注意: 需要添加 --ssl-mode=requiredmysql> status
--------------
mysql Ver 14.14 Distrib 5.7.31, for Linux (x86_64) using EditLine wrapper
Connection id:49
Current database:
Current user:tom@localhost
SSL:Cipher in use is DHE-RSA-AES128-GCM-SHA256
Current pager:stdout
Using outfile:''
Using delimiter:;
Server version:5.7.31-log Source distribution
Protocol version:10
Connection:Localhost via UNIX socket
Server characterset:utf8mb4
Db characterset:utf8mb4
Client characterset:utf8mb4
Conn. characterset:utf8mb4
UNIX socket:/tmp/mysql.sock
Uptime:12 min 8 sec
Threads: 2 Questions: 817 Slow queries: 0 Opens: 178 Flush tables: 1 Open tables: 78 Queries per second avg: 1.122
SSL项显示 Cipher in use ,表明当前链接使用了SSLmysql> show status like 'ssl_cipher';
+---------------+---------------------------+
| Variable_name | Value |
+---------------+---------------------------+
| Ssl_cipher | DHE-RSA-AES128-GCM-SHA256 |
+---------------+---------------------------+
1 row in set (0.00 sec)
Ssl_cipher 项显示的不为空证明使用了SSL
目前mysql并不是对用户强制使用SSL.#让某个tom用户强制使用SSL
ALTER USER 'tom'@'%' REQUIRE SSL;
#新建用户强制使用SSL
grant select on *.* to 'tom'@'%' identified by 'xxx' REQUIRE SSL;
注意: 强制使用SSL连接的用户一定要加: --ssl-mode=required
不建议强制所有用户使用SSL, 使用SSL会降低数据库QPS.
参考文章: