如何开启mysql ssl连接_数据传输安全

来源:这里教程网 时间:2026-02-28 20:38:04 作者:

MySQL SSL 连接能加密客户端与服务器之间的通信,防止数据在传输中被窃听或篡改。开启 SSL 不是单纯改个配置就行,需生成证书、配置服务端、验证启用状态,并让客户端明确使用 SSL 连接。

一、检查 MySQL 是否支持 SSL

登录 MySQL 执行以下命令:

SHOW VARIABLES LIKE 'have_ssl';
若返回 YES,说明编译时启用了 SSL 支持;若为 DISABLEDNO,需重新编译或升级 MySQL 版本(5.7.10+ 和 8.0 默认支持)。

二、生成 SSL 证书和密钥文件

推荐使用 OpenSSL 工具自建(测试/内网可用),生产环境建议使用受信任 CA 签发的证书。

在 MySQL 数据目录外新建 ssl 目录,执行以下命令:

生成 CA 私钥和证书:
openssl genrsa 2048 > ca-key.pem<br>
  openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca.pem
生成服务器私钥和 CSR:
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem -out server-req.pem
生成服务器证书(用 CA 签发):
openssl x509 -req -in server-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
生成客户端私钥和证书(可选,用于双向认证):
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem -out client-req.pem<br>
  openssl x509 -req -in client-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 02 -out client-cert.pem

最终得到关键文件:

ca.pem
server-cert.pem
server-key.pem
(客户端还需
client-cert.pem
client-key.pem
)。

三、配置 MySQL 服务端启用 SSL

编辑 MySQL 配置文件(如

/etc/my.cnf
/etc/mysql/mysql.conf.d/mysqld.cnf
),在
[mysqld]
段添加:

ssl-ca=/path/to/ca.pem<br>
ssl-cert=/path/to/server-cert.pem<br>
ssl-key=/path/to/server-key.pem

重启 MySQL:

sudo systemctl restart mysql
(或
mysqld
)。

验证是否生效:

SHOW VARIABLES LIKE '%ssl%';
确保

have_ssl = YES
,且
ssl_ca
ssl_cert
ssl_key
显示对应路径。

四、强制用户使用 SSL 连接(可选但推荐)

为提升安全性,可限制特定用户必须通过 SSL 登录:

CREATE USER 'appuser'@'%' IDENTIFIED BY 'password';<br>
ALTER USER 'appuser'@'%' REQUIRE SSL;<br>
FLUSH PRIVILEGES;

之后该用户若不加

--ssl-mode=REQUIRED
或等效参数,将无法连接。

五、客户端连接时启用 SSL

不同客户端方式略有差异:

mysql 命令行:
mysql -u appuser -p --ssl-mode=REQUIRED

或指定证书(双向认证时):
mysql -u appuser -p --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem
MySQL 8.0+ 默认启用安全连接:
若服务端配置了有效证书,新版客户端会自动尝试 SSL;可通过
--ssl-mode=DISABLED
关闭(不建议)。
应用代码(如 Python PyMySQL):
在连接参数中加入:
ssl={'ca': '/path/to/ca.pem', 'cert': '/path/to/client-cert.pem', 'key': '/path/to/client-key.pem'}

连接成功后,执行

STATUS;
SELECT * FROM performance_schema.status_by_thread WHERE VARIABLE_NAME = 'Ssl_cipher';
,非空表示当前连接已加密。

相关推荐