mysql如何开启和配置ssl连接_mysql数据传输加密方案

16次阅读

mysql默认不启用ssl,需手动配置证书、服务端SSL参数及强制SSL用户;通过SHOW varIABLES检查支持状态,OpenSSL生成证书,配置my.cnf启用SSL,创建require SSL用户并验证Ssl_cipher。

mysql如何开启和配置ssl连接_mysql数据传输加密方案

MySQL 默认不启用 SSL,要实现数据传输加密,必须手动开启并正确配置服务端和客户端的 SSL 支持。核心在于生成或获取有效的 SSL 证书与密钥,并在 MySQL 配置中指定路径,同时确保用户账户强制使用 SSL 连接。

检查 MySQL 是否支持 SSL

登录 MySQL 后执行以下命令:

SHOW VARIABLES LIKE ‘have_ssl‘;SHOW VARIABLES LIKE ‘ssl_version’;

若返回 DISABLEDNO,说明未编译 SSL 支持或未启用;返回 YES 表示基础支持已就绪,可继续配置。

生成 SSL 证书和密钥文件

推荐使用 OpenSSL 工具在服务器上生成自签名证书(生产环境建议使用受信任 CA 签发的证书):

  • 生成 CA 私钥和证书:
    openssl genrsa 2048 > ca-key.pem
    openssl req -new -x509 –nodes -days 3650 -key ca-key.pem -out ca.pem
  • 生成服务器私钥和证书请求:
    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 存放在 MySQL 可读目录(如 /var/lib/mysql/ssl/),权限设为 mysql:mysql 且私钥不可被组/其他用户读取(chmod 600 *.pem)。

配置 MySQL 服务端启用 SSL

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

ssl-ca = /var/lib/mysql/ssl/ca.pem
ssl-cert = /var/lib/mysql/ssl/server-cert.pem
ssl-key = /var/lib/mysql/ssl/server-key.pem

重启 MySQL 服务:
systemctl restart mysql(或 mysqld

再次执行 SHOW VARIABLES LIKE ‘ssl%’;,确认 ssl_cassl_certssl_key 显示正确路径,且 ssl_cipher 非空。

创建强制 SSL 的用户并测试连接

登录 MySQL,创建仅允许 SSL 连接的用户:

CREATE USER ‘appuser’@’%’ IDENTIFIED BY ‘strongpass’ REQUIRE SSL;
GRANT select, INSERT ON mydb.* TO ‘appuser’@’%’;
FLUSH PRIVILEGES;

客户端连接时启用 SSL:

  • 命令行连接:
    mysql -u appuser -p –ssl-ca=/path/to/ca.pem –ssl-cert=/path/to/client-cert.pem –ssl-key=/path/to/client-key.pem
  • 应用程序中(如 python PyMySQL):
    设置 ssl={'ca': '/path/to/ca.pem'} 参数
  • 验证是否启用:
    连接后执行 SHOW STATUS LIKE ‘Ssl_cipher’;,返回非空值即表示当前会话已加密

若只需服务端验证(单向 SSL),客户端只提供 --ssl-ca 即可;如需双向认证(客户端也验签),则需配置 REQUIRE X509 并提供客户端证书。

text=ZqhQzanResources