mysql ssl证书路径配置在my.cnf的[mysqld]段下三个关键项:ssl_ca、ssl_cert、ssl_key,必须为绝对路径且文件权限正确。

MySQL SSL证书路径配置在哪几个关键配置项里
MySQL 的 SSL 证书不是靠“自动发现”或“默认扫描”生效的,必须显式指定三个路径:CA 证书、服务器私钥、服务器证书。缺一不可,且路径必须是 MySQL 进程有读权限的绝对路径(不能用 ~/ 或相对路径)。
核心配置项在 my.cnf 的 [mysqld] 段下:
-
ssl_ca = /etc/mysql/ssl/ca.pem—— 必须是 PEM 格式,不能是 CRT 或 DER -
ssl_cert = /etc/mysql/ssl/server-cert.pem—— 必须与ssl_key匹配,否则启动报错SSL error: Unable to get private key from '/path/to/key' -
ssl_key = /etc/mysql/ssl/server-key.pem—— 私钥不能带密码(MySQL 不支持交互式解密),且权限必须是600(否则拒绝加载)
配置完要重启 mysqld,然后执行 SHOW VARIABLES LIKE 'have_ssl'; 确认值为 YES,再查 SHOW STATUS LIKE 'Ssl_version'; 看是否非空。
生成兼容 MySQL 8.0+ 的自签名证书要注意什么
MySQL 8.0.22+ 默认禁用 SHA-1 和 TLS 1.0/1.1,用旧脚本生成的证书大概率握手失败。别直接抄网上“openssl req -x509”三行命令——容易漏掉关键扩展。
生成时必须满足:
- 私钥用
openssl genrsa -aes256加密后,得再用openssl rsa -in server-key.pem -out server-key.pem去密码(否则 MySQL 启动卡住) - 证书请求(CSR)里
subjectAltName必须包含服务器实际访问域名或 IP,否则客户端连接时可能报X509_V_ERR_IP_ADDRESS_MISMATCH - 用
openssl x509 -req -days 3650 -sha256 -extfile openssl.cnf -extensions v3_req显式启用 v3 扩展,其中openssl.cnf要定义basicConstraints = CA:FALSE和keyUsage = digitalSignature, keyEncipherment
验证证书是否合规:运行 openssl x509 -in server-cert.pem -text -noout | grep -A1 "Subject Alternative Name",确保输出里有你的主机名或 IP。
客户端连不上 SSL,常见报错和对应检查点
不是所有报错都指向证书路径错误。先看错误信息本身,再反推哪一环断了:
-
SSL connection error: protocol version mismatch→ 服务端 TLS 版本太低(如只开 TLSv1),或客户端 MySQL 版本太老(如 5.7 客户端连 8.0.28+ 默认只允 TLSv1.2+) -
SSL error: SSL_CTX_set_default_verify_paths failed→ 客户端没传--ssl-ca,或传了但文件路径错/权限不足/格式非 PEM -
Access denied for user 'u'@'h' (using password: YES)+ SSL 已启用 → 很可能是用户没绑定 SSL 要求,执行ALTER USER 'u'@'h' REQUIRE X509;或REQUIRE SSL才能强制走加密通道
测试命令建议用:mysql --ssl-mode=REQUIRED --ssl-ca=/path/to/ca.pem -u test -h db.example.com,避免依赖 my.cnf 里的全局设置干扰判断。
MySQL 5.7 和 8.0 在 SSL 配置上的关键差异
升级或迁移时最容易栽在这儿:8.0 把 SSL 相关变量全改名了,而且默认行为更严格。
- 5.7 用
ssl-ca/ssl-cert/ssl-key;8.0 改成ssl_ca/ssl_cert/ssl_key(下划线,且只认小写) - 8.0 默认开启
require_secure_transport = ON,意味着所有连接(包括本地 socket)都必须走加密,不配 SSL 就连不上 —— 开发环境常因此被卡住 - 8.0 的
CREATE USER语法里,REQUIRE SSL和REQUIRE X509是互斥的,不能同时写;而 5.7 允许混用(虽然无效)
如果用 Docker,注意挂载证书时路径映射要一致,且容器内 MySQL 进程 UID(通常是 mysql 用户)必须对证书文件有读权限,chown 1001:1001 *.pem 比 chmod 777 更安全也更有效。










