在 MySQL 8.0 中,使用 SSL/TLS 加密可以显著提高数据库连接的安全性。
生成 SSL/TLS 证书
首先,你需要生成 SSL/TLS 证书。你可以使用 OpenSSL 工具来生成自签名证书,或者从受信任的证书颁发机构(CA)获取证书。
使用 OpenSSL 生成自签名证书
-
安装 OpenSSL :
确保你的系统上已经安装了 OpenSSL。如果没有,可以通过包管理器进行安装。例如,在 Ubuntu 上:
shsudo apt-get install openssl
-
创建证书颁发机构 (CA) 密钥和证书:
shopenssl genpkey -algorithm RSA -out ca-key.pem openssl req -new -x509 -days 365 -key ca-key.pem -out ca-cert.pem
-
创建服务器密钥和证书请求:
shopenssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem
-
用 CA 证书签署服务器证书请求:
shopenssl x509 -req -in server-req.pem -days 365 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
-
创建客户端密钥和证书请求:
shopenssl req -newkey rsa:2048 -nodes -keyout client-key.pem -out client-req.pem
-
用 CA 证书签署客户端证书请求:
shopenssl x509 -req -in client-req.pem -days 365 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
配置 MySQL 以使用 SSL/TLS
-
将证书文件复制到 MySQL 服务器目录 :
将生成的证书文件(
ca-cert.pem
,server-cert.pem
,server-key.pem
)复制到 MySQL 服务器的一个安全目录中,例如/etc/mysql/ssl/
。 -
编辑 MySQL 配置文件 :
打开 MySQL 的配置文件
my.cnf
或my.ini
,并添加以下配置:ini[mysqld] ssl-ca=/etc/mysql/ssl/ca-cert.pem ssl-cert=/etc/mysql/ssl/server-cert.pem ssl-key=/etc/mysql/ssl/server-key.pem
-
重启 MySQL 服务 :
使配置生效,重启 MySQL 服务:
shsudo systemctl restart mysql
验证 SSL/TLS 配置
-
检查 MySQL 服务器状态 :
登录到 MySQL 服务器并运行以下命令,确保 SSL 已启用:
sqlSHOW VARIABLES LIKE '%ssl%';
输出应显示
have_ssl
为YES
,并且其他 SSL 相关变量也应正确配置。 -
测试 SSL 连接 :
使用客户端工具(如
mysql
命令行工具)进行 SSL 连接测试:shmysql --ssl-ca=/etc/mysql/ssl/ca-cert.pem --ssl-cert=/etc/mysql/ssl/client-cert.pem --ssl-key=/etc/mysql/ssl/client-key.pem -u your_username -p -h your_host
如果成功连接,说明 SSL/TLS 配置正确。
强制使用 SSL/TLS
为了确保所有连接都使用 SSL/TLS,可以在 MySQL 中强制要求 SSL 连接。
-
创建或修改用户账户 :
在 MySQL 中创建或修改用户账户,要求其使用 SSL 连接:
sqlCREATE USER 'your_user'@'your_host' IDENTIFIED BY 'your_password' REQUIRE SSL; GRANT ALL PRIVILEGES ON *.* TO 'your_user'@'your_host' REQUIRE SSL; FLUSH PRIVILEGES;
-
验证强制 SSL 连接 :
尝试不使用 SSL 连接到该用户账户,应该会失败:
shmysql -u your_user -p -h your_host
如果连接失败,并提示需要 SSL,说明强制 SSL 配置成功。
监控和维护
-
定期更新证书 :
自签名证书的有效期通常为一年。定期更新证书并重新分发给客户端。
-
监控 SSL/TLS 连接 :
使用 MySQL 的日志功能监控 SSL/TLS 连接情况,确保所有连接都是加密的。