MySQL在Ubuntu上启用SSL需同时满足服务端加载证书、用户强制REQUIRE SSL、客户端显式指定--ssl-mode=REQUIRED三条件,缺一即降级明文;须确认have_ssl=YES且version_ssl_library显示OpenSSL版本,证书须由mysql用户生成并确保属主权限正确,配置require_secure_transport=ON且重启服务生效。

MySQL在Ubuntu上开启SSL加密连接,不是配完证书就自动生效的——必须同时满足服务端加载、用户强制、客户端显式启用三者,缺一就会静默降级为明文传输。
确认MySQL编译时已链接OpenSSL
这是最容易跳过的前置检查。即使have_ssl显示YES,若底层没链接加密库,所有配置都白搭。
- 登录MySQL执行:
SHOW VARIABLES LIKE 'have_ssl';,结果必须是YES(不是DISABLED或NO) - 再查:
SHOW VARIABLES LIKE 'version_ssl_library';,返回应为类似OpenSSL 1.1.1f;若为空或报错,说明未链接SSL库 - 修复方式:重装官方
mysql-server包(sudo apt install --reinstall mysql-server),仅重装mysql-client无效
用mysql_ssl_rsa_setup生成证书但必须用mysql用户运行
这个工具不改配置、不重启、不授权,且对运行身份极其敏感:用root跑,生成的server-key.pem属主是root,mysqld根本读不了,have_ssl就仍是DISABLED。
- 先确认数据目录归属:
ls -ld /var/lib/mysql/,输出中属主必须是mysql - 切换用户执行:
sudo -u mysql mysql_ssl_rsa_setup --datadir=/var/lib/mysql - 验证生成结果:
sudo -u mysql ls -l /var/lib/mysql/*.pem,确保server-key.pem权限是-rw-------(600)且属主为mysql - 若报
Permission denied或日志出现SSL_CTX_set_default_verify_paths failed,大概率是AppArmor拦截,临时可运行:sudo aa-disable /usr/sbin/mysqld排查
在mysqld.cnf中配绝对路径并重启服务
SSL配置不支持热加载,写错路径、漏掉[mysqld]段、或只reload不restart,都会导致证书不加载。
MySQL 数据库管理技能,能够通过自然语言查询和管理数据库,支持 SELECT/INSERT/UPDATE/DELETE、表管理、备份恢复等操作。当用户提及 MySQL、数据库查询、建表或数据备份时使用此技能。
- 编辑
/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段下添加:
require_secure_transport = ON ssl_ca = /var/lib/mysql/ca.pem ssl_cert = /var/lib/mysql/server-cert.pem ssl_key = /var/lib/mysql/server-key.pem
require_secure_transport = ON是强制所有TCP连接走SSL的开关,不加它,用户仍可用--ssl-mode=DISABLED绕过sudo systemctl restart mysql(不是reload)SHOW VARIABLES LIKE '%ssl%';,确认ssl_ca/ssl_cert/ssl_key值已正确显示路径创建REQUIRE SSL用户并用--ssl-mode=REQUIRED连接
服务端开了SSL ≠ 连接就加密。用户没强制、客户端没声明,照样走明文。
- 创建强制SSL用户:
CREATE USER 'appuser'@'%' IDENTIFIED BY 'StrongPass123!' REQUIRE SSL; - 或修改现有用户:
ALTER USER 'existing_user'@'%' REQUIRE SSL; - 客户端连接时必须显式启用:
mysql -u appuser -p --host=127.0.0.1 --ssl-mode=REQUIRED(注意用127.0.0.1而非localhost,后者走socket不走TCP) - 连接成功后,执行
\s查看状态,Cipher字段非空即表示加密已生效;若仍显示SSL: Not in use,说明某处没到位
最常被忽略的是require_secure_transport = ON这行配置——没有它,哪怕用户设了REQUIRE SSL,攻击者只要加个--ssl-mode=DISABLED就能绕过。另外,证书文件权限和属主一旦出错,MySQL日志里往往只报模糊错误,得盯住/var/log/mysql/error.log里的实际提示才好定位。










