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

MySQL 默认不启用 SSL,要实现数据传输加密,必须手动开启并正确配置服务端和客户端的 SSL 支持。核心在于生成或获取有效的 SSL 证书与密钥,并在 MySQL 配置中指定路径,同时确保用户账户强制使用 SSL 连接。
检查 MySQL 是否支持 SSL
登录 MySQL 后执行以下命令:
SHOW VARIABLES LIKE 'have_ssl'; 或 SHOW VARIABLES LIKE 'ssl_version';
若返回 DISABLED 或 NO,说明未编译 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.pem、server-cert.pem、server-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_ca、ssl_cert、ssl_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 并提供客户端证书。










