MySQL默认不启用SSL,需配置ssl_ca、ssl_cert、ssl_key路径及require_secure_transport=ON并重启服务,且server-key.pem权限须为600、属主mysql,最后通过SHOW STATUS LIKE 'Ssl_cipher'验证加密是否生效。

新装的 MySQL 默认不启用 SSL,即使你生成了证书,require_secure_transport 不开、证书路径没配对、私钥权限不对,连接照样走明文——你不会收到任何报错,但 Ssl_cipher 始终为空。
确认 MySQL 真支持 SSL 而非仅编译支持
别信 have_ssl = YES 就万事大吉。它只表示编译时链接了 OpenSSL,不代表服务端已加载证书。
- 执行
mysql -e "SHOW VARIABLES LIKE 'have_ssl';":若返回DISABLED或空,说明 mysqld 启动时根本没读到证书,立刻停手检查配置 - 再查
SHOW VARIABLES LIKE 'tls_version';:必须含TLSv1.2或更高;若只有TLSv1.0,说明 OpenSSL 版本太旧或被裁剪(如 Alpine 镜像) - 若
have_ssl是DISABLED,重装官方二进制包最省事——很多国产 OS 精简版或 MariaDB 替代包压根没开-DWITH_SSL=system
用 mysql_ssl_rsa_setup 生成证书但必须切用户 + 检查权限
这个工具不改配置、不设权限、不重启,只生成文件。90% 的“证书生成成功但 SSL 不生效”都卡在这三步。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 先确认数据目录归属:
ls -ld /var/lib/mysql/,属主必须是mysql - 切换用户执行:
sudo -u mysql mysql_ssl_rsa_setup --datadir=/var/lib/mysql,否则server-key.pem属主是 root,mysqld 读不了 - 检查生成文件:
ls -l /var/lib/mysql/*.pem,server-key.pem必须是-rw-------(600),且属主为mysql - 若日志出现
SSL_CTX_set_default_verify_paths failed,大概率是 SELinux 拦截,临时验证:sudo setenforce 0
my.cnf 中四行配置缺一不可且路径必须绝对
ssl_ca、ssl_cert、ssl_key 三者路径写错一个,或漏掉 require_secure_transport = ON,就等于没开 SSL。
- 在
[mysqld]段末尾添加(路径不能用~或./):ssl_ca = /var/lib/mysql/ca.pemssl_cert = /var/lib/mysql/server-cert.pemssl_key = /var/lib/mysql/server-key.pemrequire_secure_transport = ON -
server-key.pem必须无密码:若已有密码,运行openssl rsa -in server-key.pem -out server-key.pem去密 - 改完必须
systemctl restart mysqld——reload不触发 SSL 重载 - 证书 CN 或
subjectAltName必须匹配客户端连接地址(如连127.0.0.1,证书里就得有IP:127.0.0.1),否则客户端报X509_V_ERR_IP_ADDRESS_MISMATCH
验证是否真加密:看 Ssl_cipher,不是看 have_ssl
SHOW VARIABLES LIKE '%ssl%' 只告诉你“配了啥”,SHOW STATUS LIKE 'Ssl_cipher' 才告诉你“当前连接有没有加密”。
- 连上后立即执行:
mysql -u root -p -e "SHOW STATUS LIKE 'Ssl_cipher';",返回非空值(如DHE-RSA-AES256-SHA)才算成功 - 再查
SHOW STATUS LIKE 'Ssl_version';,确认是TLSv1.2或更高 - 客户端测试命令:
mysql --ssl-mode=REQUIRED -u root -p,若报SSL is required but the server doesn't support it,说明服务端require_secure_transport未生效或证书加载失败
最容易被忽略的是:证书路径权限和 require_secure_transport = ON 的组合效果——哪怕证书全对、have_ssl = YES,只要这一行没加,所有客户端连接默认仍走明文,且完全静默。

















