mysql 8.0+自签名证书必须用mysql_ssl_rsa_setup或严格按官方openssl流程生成,否则易启动失败或报“ssl is required but the server doesn't support it”;该工具默认兼容所有8.0+版本,跳过扩展字段等兼容性雷区,且需确保数据目录属主为mysql、路径绝对、权限合规、cn匹配访问地址。

MySQL 8.0+ 自签名证书必须用 mysql_ssl_rsa_setup 或严格按官方 OpenSSL 流程生成,否则大概率启动失败或客户端报 “SSL is required but the server doesn't support it”。
mysql_ssl_rsa_setup 是最稳的选择(MySQL 8.0+)
它生成的证书默认兼容所有 8.0+ 版本,跳过 OpenSSL 扩展字段、密钥用法等兼容性雷区。
- 确保 MySQL 数据目录可写(如
/var/lib/mysql/),且属主为mysql用户:sudo chown -R mysql:mysql /var/lib/mysql/ - 执行命令(
--uid显式指定用户,避免权限问题):mysql_ssl_rsa_setup --datadir=/var/lib/mysql --uid=mysql - 检查生成结果:
ls -l /var/lib/mysql/*.pem—— 应看到ca.pem、server-cert.pem、server-key.pem等文件 - 注意:该工具不生成
client-cert.pem,如需客户端双向认证,得手动补
手动生成时 CommonName 和扩展字段是关键坑点
MySQL 对证书的 CommonName(CN)和 subjectAltName 极其敏感。填错或含扩展字段,服务端加载证书会静默失败(have_ssl 仍为 DISABLED)。
- CA 证书生成(无 CN 限制,但别加
subjectAltName):openssl genrsa 2048 > ca-key.pemopenssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca.pem -subj "/CN=MySQL-CA" - 服务器私钥与 CSR:CN 必须匹配客户端将连接的地址(如
localhost、192.168.1.100或域名):openssl req -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem -out server-req.pem -subj "/CN=localhost" - 签发服务器证书时禁用
subjectAltName,并强制用sha256WithRSAEncryption:openssl x509 -req -in server-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -sha256 - 私钥必须不加密(
-nodes已保证),否则 MySQL 启动直接报错退出
证书路径和权限比内容还重要
即使证书完全合规,只要路径不对或权限不足,MySQL 就当没这回事——have_ssl 依然显示 DISABLED。
-
ssl_ca、ssl_cert、ssl_key在my.cnf中**必须写绝对路径**,例如:ssl_ca = /var/lib/mysql-ssl/ca.pemssl_cert = /var/lib/mysql-ssl/server-cert.pemssl_key = /var/lib/mysql-ssl/server-key.pem - MySQL 进程(通常是
mysql用户)必须能读取这些文件:sudo -u mysql ls -l /var/lib/mysql-ssl/—— 每个.pem文件都应显示-rw-r-----或更宽松,且属主为mysql - 不要把证书放
/etc/mysql/conf.d/这类配置目录下;推荐统一放在/var/lib/mysql-ssl/,和数据目录逻辑隔离 - SELinux 或 AppArmor 启用时,
ls -Z查看上下文,必要时运行:sudo semanage fcontext -a -t mysqld_etc_t "/var/lib/mysql-ssl(/.*)?"sudo restorecon -Rv /var/lib/mysql-ssl/
真正卡住人的从来不是“怎么生成”,而是证书加载失败却不报具体错误——务必先查 SHOW VARIABLES LIKE 'have_ssl';,等于 DISABLED 就别调客户端了,回头盯服务端路径、权限、CN 和 OpenSSL 命令参数。











