mysql如何配置SSL证书路径_mysql安全证书环境生成

3次阅读

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

mysql如何配置SSL证书路径_mysql安全证书环境生成

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:FALSEkeyUsage = 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 SSLREQUIRE X509 是互斥的,不能同时写;而 5.7 允许混用(虽然无效)

如果用 docker,注意挂载证书时路径映射要一致,且容器内 MySQL 进程 UID(通常是 mysql 用户)必须对证书文件有读权限,chown 1001:1001 *.pemchmod 777 更安全也更有效。

text=ZqhQzanResources