必须先确认have_ssl= YES,再配置ssl_ca/cert/key绝对路径并重启,最后客户端显式设置ssl_mode;证书须PEM无密钥、CN匹配且权限严格,require_secure_transport=ON才真正强制加密。

确认 MySQL 编译时已启用 SSL 支持
如果 have_ssl 返回 DISABLED 或 NO,后续所有配置都无效。必须先验证底层支持:
登录 MySQL 后执行:SHOW VARIABLES LIKE 'have_ssl';
- 返回
YES:说明编译时启用了 OpenSSL,可继续 - 返回
DISABLED:MySQL 进程未加载证书,但支持 SSL —— 这是正常中间态,下一步配置后会变YES - 返回
NO:需重装 MySQL(带 OpenSSL 支持)或换发行版(如 Percona Server、官方二进制包)
生成兼容 MySQL 的 PEM 格式证书(推荐 mysql_ssl_rsa_setup)
MySQL 8.0+ 自带工具,比手写 OpenSSL 命令更稳妥,避免常见格式/权限/密钥加密问题:
- 确保 MySQL 数据目录归属正确:
chown -R mysql:mysql /var/lib/mysql - 运行一键生成:
mysql_ssl_rsa_setup --datadir=/var/lib/mysql --uid=mysql - 生成后检查关键文件是否存在:
ls -l /var/lib/mysql/ca.pem /var/lib/mysql/server-cert.pem /var/lib/mysql/server-key.pem - 特别注意:
server-key.pem必须无密码(openssl rsa -check -in server-key.pem不提示输入密码才算合格)
在 my.cnf 中配置 ssl_ca / ssl_cert / ssl_key 路径
路径必须是绝对路径,且 MySQL 进程(通常是 mysql 用户)有读取权限。不能用相对路径或符号链接(某些版本会拒绝):
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 编辑
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段落下添加:
ssl-ca = /var/lib/mysql/ca.pem ssl-cert = /var/lib/mysql/server-cert.pem ssl-key = /var/lib/mysql/server-key.pem
- 路径错误典型表现:
SHOW VARIABLES LIKE 'ssl%';中ssl_ca等值为空,ssl_cipher仍为空 - 权限错误典型表现:MySQL 启动日志报
Can't read from '/var/lib/mysql/server-key.pem' (Errcode: 13 - Permission denied) - 重启必须用
systemctl restart mysqld(不是reload),否则配置不加载
验证 SSL 是否真正启用并生效
配置完重启只是第一步,必须验证连接层是否实际加密。只看 have_ssl = YES 不够,还要确认通信链路:
- 执行
SHOW VARIABLES LIKE 'ssl_cipher';—— 非空才表示服务端 TLS 握手准备就绪 - 用客户端连接时显式要求 SSL:
mysql -u root -p --ssl-mode=REQUIRED - 连接成功后执行:
STATUS;或\s,查看输出中SSL:行是否显示加密套件(如SSL: Cipher in use is TLS_AES_256_GCM_SHA384) - 若仍走明文,常见原因是客户端没声明
--ssl-mode,或用户未绑定 SSL 要求(ALTER USER 'u'@'%' REQUIRE SSL;)
最易被忽略的一点:服务端配了证书 ≠ 客户端自动加密。MySQL 默认容忍明文连接,除非你强制用户 REQUIRE SSL 或客户端主动协商 —— 这一步漏掉,整个 SSL 配置就形同虚设。










