生产环境MySQL SSL加密需满足三要素:服务端证书可信、用户强制走加密通道、客户端验证证书。先检查have_ssl=YES、ssl_ca等路径有效、Ssl_version为TLSv1.2/1.3;禁用默认自签名证书,推荐可信CA或私有CA签发;配置ssl-ca/cert/key并重启;通过REQUIRE SSL绑定账号,启用require_secure_transport=ON;最后用--ssl-mode=REQUIRED/DISABLED验证加密有效性。
生产环境配置 MySQL SSL 加密,不能只靠“开了 SSL”就认为安全了。必须确保服务端证书可信、用户强制走加密通道、客户端真正验证证书——三者缺一不可。否则 Wireshark 一抓包,密码和 SQL 全是明文。
确认基础条件是否满足
先别改配置,登录 MySQL 执行:
SHOW VARIABLES LIKE 'have_ssl';
—— 必须返回
YES
,若为 DISABLED,说明底层未启用 SSL 支持
SHOW VARIABLES LIKE '%ssl_%';
—— 检查
、
、
是否指向有效路径(如
)
SHOW STATUS LIKE 'Ssl_version';
—— 应显示 TLSv1.2 或 TLSv1.3,为空则表示握手未成功
若
,常见原因:私钥权限不是 600、MySQL 用户无证书读取权、SELinux/AppArmor 拦截、OpenSSL 版本过低(如 Alpine 镜像用 WolfSSL 替代 OpenSSL)。
生成并部署可信证书
生产环境严禁使用自动生成的默认证书(如
初次启动生成的),因其 CA 为自签名,客户端易报
或
。
推荐向可信 CA(如 Let’s Encrypt、DigiCert)申请域名证书,CommonName 填写数据库访问域名(如
)
若内网部署,可自建私有 CA:
– 用
生成根密钥
–
签发根证书
– 再签发服务器证书,
必须与客户端连接时使用的地址一致
证书文件统一存放在
,执行:
服务端配置与重启验证
编辑
或
,在
段落添加:
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
重启后立即验证:
理想输出:
,
(或类似 TLSv1.3 密码套件)。
强制用户走 SSL 并限制连接方式
仅服务端配证书毫无意义。必须绑定账号策略:
新建账号时直接要求 SSL:
已有账号升级强制策略:
更严格场景可启用双向认证:
禁止任何非 SSL 连接:
在配置中加
(MySQL 5.7.17+ 支持),该参数启用后,所有用户(包括 root)都必须走加密连接
测试连接是否真正加密:
再用
尝试,应报错
。
ssl_cassl_certssl_key/var/lib/mysql/ca.pemhave_ssl = DISABLEDmysql_ssl_rsa_setupX509 certificate has expiredself-signed certificate in certificate chaindb.prod.example.comopenssl genrsa -out ca-key.pem 4096openssl req -new -x509 -days 3650 -key ca-key.pem -out ca-cert.pemCommonName/etc/mysql/ssl/chown -R mysql:mysql /etc/mysql/sslchmod 600 /etc/mysql/ssl/server-key.pem/etc/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf[mysqld]ssl-ca = /etc/mysql/ssl/ca-cert.pemssl-cert = /etc/mysql/ssl/server-cert.pemssl-key = /etc/mysql/ssl/server-key.pemsystemctl restart mysql && mysql -u root -p -e "SHOW VARIABLES LIKE 'have_ssl'; SHOW STATUS LIKE 'Ssl_cipher';"have_ssl: YESSsl_cipher: TLS_AES_256_GCM_SHA384CREATE USER 'app_rw'@'10.10.%.%' IDENTIFIED BY 'StrongPwd2026!' REQUIRE SSL;ALTER USER 'app_ro'@'10.10.%.%' REQUIRE SSL;ALTER USER 'backup_user'@'172.16.%.%' REQUIRE X509 SUBJECT '/CN=mysqldump-client';require_secure_transport = ONmysql -u app_rw -p -h db.prod.example.com --ssl-mode=REQUIRED -e "SELECT @@version;"mysql -u app_rw -p -h db.prod.example.com --ssl-mode=DISABLEDAccess denied