mysql安装完成后配置SSL加密连接的方法

13次阅读

mysql 默认不启用ssl,需手动配置证书路径、权限及服务端参数,并通过ALTER USER require SSL强制用户加密连接。

mysql安装完成后配置SSL加密连接的方法

确认 MySQL 是否支持 SSL

安装完 MySQL 后,不能直接假设 SSL 已启用。先连上 MySQL,执行 SHOW varIABLES LIKE 'have_ssl';SHOW VARIABLES LIKE 'ssl_mode';。如果返回值是 DISABLEDNO,说明 OpenSSL 库未加载或配置缺失——这和是否安装了 OpenSSL 无关,而是 MySQL 启动时没找到证书路径或权限不对。

常见错误现象:mysql -u root -p --ssl-mode=REQUIred 连接失败,报错 SSL connection Error: protocol version mismatch 或直接退回非加密连接,基本都是这个原因。

  • 检查 mysqld 进程是否带 --ssl 参数启动(ps aux | grep mysqld
  • 确认 OpenSSL 版本兼容:MySQL 8.0.28+ 推荐 OpenSSL 1.1.1+;低于该版本可能不支持 TLSv1.3
  • linux 上若用包管理器安装(如 apt/yum),默认通常不生成证书,需手动创建或指定路径

生成 PEM 格式证书和私钥文件

MySQL 要求证书为 PEM 格式,且私钥不能加密(即无密码)。用 OpenSSL 生成时必须避开交互式密码输入,否则 MySQL 启动会卡住。

openssl req -x509 -nodes -days 3650 -newkey rsa:2048    -keyout /var/lib/mysql/server-key.pem    -out /var/lib/mysql/server-cert.pem    -subj "/CN=localhost"

关键点:

  • -nodes 必须存在,否则私钥带密码,MySQL 无法自动读取
  • 路径建议放在 /var/lib/mysql/(数据目录内),避免 SELinux 或 appArmor 拒绝访问
  • 文件权限必须是 mysql:mysql 且私钥权限设为 600chown mysql:mysql /var/lib/mysql/server-*.pem && chmod 600 /var/lib/mysql/server-key.pem
  • 不要用 ca.pem 做客户端验证时,除非你真需要双向认证;单向加密只需 server-cert.pem + server-key.pem

修改 my.cnf 并重启 mysqld

[mysqld] 段落中添加证书路径,不是 [client][mysql] —— 那些只影响客户端行为,服务端 SSL 由 mysqld 进程控制。

[mysqld] ssl_ca=/var/lib/mysql/server-cert.pem ssl_cert=/var/lib/mysql/server-cert.pem ssl_key=/var/lib/mysql/server-key.pem

注意:

  • ssl_ca 在单向加密中可指向和 ssl_cert 相同的文件(自签名场景),但语义上它应是 CA 证书;MySQL 8.4 开始更倾向使用 ssl_mode=REQUIRED 替代旧参数
  • 改完后运行 mysqld --validate-config 检查语法,再 systemctl restart mysqld
  • 重启失败?大概率是路径错、权限错、或私钥被加密。查日志:journalctl -u mysqld -n 50 --no-pager,重点看 SSL error

验证连接是否走 SSL 及强制客户端加密

登录后执行 STATUS;select * FROM performance_schema.status_by_thread WHERE VARIABLE_NAME = 'Ssl_cipher';。如果 Ssl_cipher 非空,说明当前连接已加密。

要强制所有用户走 SSL,需修改用户账户:

ALTER USER 'app_user'@'%' REQUIRE SSL; FLUSH PRIVILEGES;

此时该用户用 mysql -u app_user -p 会失败,必须显式加 --ssl-mode=REQUIRED。容易忽略的一点是:localhost 连接默认走 socket,不走 TCP,因此即使设了 REQUIRE SSL,本地连接仍可能绕过——测试务必用 -h 127.0.0.1 或远程 IP。

另外,MySQL 8.0+ 默认 ssl_mode=DISABLED,客户端不声明就绝不加密;别指望“配完服务端就自动全量加密”。

text=ZqhQzanResources