mysql服务端ssl启用需同时满足have_ssl=yes且ssl_mode=required或更严格;证书须用mysql_ssl_rsa_setup生成,配置ssl_ca/cert/key路径并确保server-key.pem权限为600。

MySQL服务端怎么确认SSL已启用
直接查系统变量最可靠,have_ssl 和 ssl_mode 必须同时满足条件才算真正可用。
-
have_ssl值为YES表示编译时支持SSL,但不等于已启用 -
ssl_mode值为REQUIRED或更严格(如VERIFY_CA)才代表服务端强制要求SSL连接 - 如果
have_ssl是DISABLED,说明启动时加了--skip-ssl或配置文件写了skip_ssl,得先删掉 - 执行
SHOW VARIABLES LIKE 'have_ssl';和SHOW VARIABLES LIKE 'ssl_mode';双查,缺一不可
生成和加载证书的最小必要步骤
MySQL 5.7+ 自带 mysql_ssl_rsa_setup 工具,比手动生成 OpenSSL 配置更稳妥,尤其避免 CN 不匹配或密钥权限问题。
- 运行
mysql_ssl_rsa_setup --datadir=/var/lib/mysql(路径必须和datadir一致) - 检查生成的文件:必须有
ca.pem、server-cert.pem、server-key.pem,且属主是mysql用户 - 在
my.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 - 切勿复用客户端证书当服务端证书——
server-key.pem必须是私钥,且权限必须是600,否则 MySQL 启动失败并报错SSL error: Unable to get private key
客户端连接时如何强制走SSL并验证证书
只加 --ssl-mode=REQUIRED 不够,中间人攻击仍可能发生;要验证 CA 才算真正安全。
- 命令行连接示例:
mysql -u user -p --ssl-mode=VERIFY_CA --ssl-ca=/path/to/ca.pem --ssl-cert=/path/to/client-cert.pem --ssl-key=/path/to/client-key.pem -
--ssl-mode=REQUIRED仅加密,不校验服务端身份;VERIFY_CA或VERIFY_IDENTITY才会读取--ssl-ca并校验证书链 - 如果用 JDBC,URL 要写全参数:
?useSSL=true&requireSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file:/path/to/truststore,光靠useSSL=true在新版驱动里默认被忽略 - PHP 的
mysqli需显式调用mysqli_ssl_set(),否则即使配置了全局 SSL 参数也不生效
常见连接失败错误对应排查点
报错不是配置没写对,就是证书/密钥权限或路径不对,极少是协议不兼容。
-
SSL connection error: protocol version mismatch→ 检查客户端 MySQL 版本是否低于服务端(如 5.6 客户端连 8.0+ 服务端),升级客户端或降级服务端tls_version配置 -
SSL connection error: SSL is required but the server doesn't support it→have_ssl是NO或DISABLED,不是配置漏了就是 mysqld 启动时被跳过 -
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)→ 典型私钥权限问题,ls -l server-key.pem看是不是600且属主为mysql - 连接成功但
STATUS里显示SSL: Cipher in use is ...为空 → 客户端根本没协商 SSL,检查是否误用了--skip-ssl或驱动自动降级
证书有效期、CN 域名匹配、CA 信任链这些在内网自签场景下容易被忽略,但一旦上生产环境对接外部系统,就是第一道卡点。











