跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

针对生产环境如何配置MySQL数据库的SSL加密传输实战

生产环境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_%'; —— 检查
ssl_ca
ssl_cert
ssl_key
是否指向有效路径(如
/var/lib/mysql/ca.pem
) SHOW STATUS LIKE 'Ssl_version'; —— 应显示 TLSv1.2 或 TLSv1.3,为空则表示握手未成功 若
have_ssl = DISABLED
,常见原因:私钥权限不是 600、MySQL 用户无证书读取权、SELinux/AppArmor 拦截、OpenSSL 版本过低(如 Alpine 镜像用 WolfSSL 替代 OpenSSL)。 生成并部署可信证书 生产环境严禁使用自动生成的默认证书(如
mysql_ssl_rsa_setup
初次启动生成的),因其 CA 为自签名,客户端易报
X509 certificate has expired
self-signed certificate in certificate chain
。 推荐向可信 CA(如 Let’s Encrypt、DigiCert)申请域名证书,CommonName 填写数据库访问域名(如
db.prod.example.com
) 若内网部署,可自建私有 CA: – 用
openssl genrsa -out ca-key.pem 4096
生成根密钥 –
openssl req -new -x509 -days 3650 -key ca-key.pem -out ca-cert.pem
签发根证书 – 再签发服务器证书,
CommonName
必须与客户端连接时使用的地址一致 证书文件统一存放在
/etc/mysql/ssl/
,执行:
chown -R mysql:mysql /etc/mysql/ssl
chmod 600 /etc/mysql/ssl/server-key.pem
服务端配置与重启验证 编辑
/etc/my.cnf
/etc/mysql/mysql.conf.d/mysqld.cnf
,在
[mysqld]
段落添加: MySQL(Linux) MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。 下载
ssl-ca = /etc/mysql/ssl/ca-cert.pem
ssl-cert = /etc/mysql/ssl/server-cert.pem
ssl-key = /etc/mysql/ssl/server-key.pem
重启后立即验证:
systemctl restart mysql && mysql -u root -p -e "SHOW VARIABLES LIKE 'have_ssl'; SHOW STATUS LIKE 'Ssl_cipher';"
理想输出:
have_ssl: YES
Ssl_cipher: TLS_AES_256_GCM_SHA384
(或类似 TLSv1.3 密码套件)。 强制用户走 SSL 并限制连接方式 仅服务端配证书毫无意义。必须绑定账号策略: 新建账号时直接要求 SSL:
CREATE 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';
禁止任何非 SSL 连接: 在配置中加
require_secure_transport = ON
(MySQL 5.7.17+ 支持),该参数启用后,所有用户(包括 root)都必须走加密连接 测试连接是否真正加密:
mysql -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=DISABLED
尝试,应报错
Access denied

相关文章