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

11次阅读

mysql ssl连接需先确认支持、生成证书、配置服务端、强制用户SSL及客户端启用;具体包括检查have_ssl变量、用OpenSSL生成CA/服务器/客户端证书、配置my.cnf中ssl-ca/cert/key路径、ALTER USER require SSL、客户端使用–ssl-mode=REQUIred或代码中传入SSL参数。

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

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

一、检查 MySQL 是否支持 SSL

登录 MySQL 执行以下命令:

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

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

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

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

  • 生成 CA 私钥和证书:
    openssl genrsa 2048 > ca-key.pem
    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
    openssl x509 -req -in client-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 02 -out client-cert.pem

最终得到关键文件:ca.pemserver-cert.pemserver-key.pem(客户端还需 client-cert.pemclient-key.pem)。

三、配置 MySQL 服务端启用 SSL

编辑 MySQL 配置文件(如 /etc/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf),在 [mysqld] 段添加:

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

重启 MySQL:sudo systemctl restart mysql(或 mysqld)。

验证是否生效:

SHOW VARIABLES LIKE ‘%ssl%’;
确保 have_ssl = YES,且 ssl_cassl_certssl_key 显示对应路径。

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

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

CREATE USER 'appuser'@'%' IDENTIFIED BY 'password';
ALTER USER 'appuser'@'%' REQUIRE SSL;
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';,非空表示当前连接已加密。

text=ZqhQzanResources