一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何启用MySQL客户端与服务端SSL连接

时间:2026-08-28 09:48:47 编辑:袖梨 来源:一聚教程网

必须先验证MySQL服务端SSL真实状态:执行SHOW VARIABLES LIKE 'have_ssl'返回YES且ssl_cipher非空,再确认ssl_ca/cert/key为绝对路径、文件存在、mysqld有读权限,并重启服务而非reload。

确认 MySQL 服务端已实际启用 SSL

很多配置失败的根源在于:服务端看似配了证书,但 ssl_cipher 为空、have_sslDISABLED,或仅 reload 未重启。必须先验证真实状态:

  1. 登录 MySQL 执行 SHOW VARIABLES LIKE 'have_ssl';,返回 YES 才代表编译支持;若为 DISABLED,说明证书路径无效或权限不足
  2. 再查 SHOW VARIABLES LIKE 'ssl%';,重点看 ssl_cassl_certssl_key 是否指向绝对路径,且文件存在、MySQL 进程(如 mysql 用户)有读权限
  3. ssl_cipher 非空(如 DHE-RSA-AES256-SHA)才是 SSL 真正生效的标志;仅配置路径不重启 mysqld,该值仍为空

服务端配置必须写死绝对路径并重启

my.cnf 中的证书路径不能用相对路径、环境变量或符号链接——MySQL 启动时直接读取,不解析上下文。

  1. [mysqld] 段写入三行,路径必须完整:ssl_ca = /var/lib/mysql/ca.pemssl_cert = /var/lib/mysql/server-cert.pemssl_key = /var/lib/mysql/server-key.pem
  2. 私钥文件 server-key.pem 必须无密码(生成时加 -nodes),否则启动失败,错误日志里会出现 SSL error: Unable to get private key
  3. 改完配置后执行 systemctl restart mysql(不是 reload),否则变更不加载

客户端连接必须显式声明 ssl_mode 或证书参数

服务端开了 SSL ≠ 客户端自动加密。默认行为仍是明文,必须主动要求。

  1. 命令行连接时,最简方式是加 --ssl-mode=REQUIRED,例如:mysql -u user -p --ssl-mode=REQUIRED -h db.example.com
  2. 若服务端证书是自签名或非公共 CA 签发,需额外指定 CA 文件:--ssl-ca=/path/to/ca.pem;否则会报错 SSL connection error: Certificate verification failed
  3. 应用代码中(如 Python 的 pymysql 或 Go 的 mysql 驱动),需在 DSN 里显式设置 ssl_mode=REQUIRED 或传入 ssl 字典,不能只依赖服务端配置

强制用户走 SSL 的坑:REQUIRE SSL 不等于全局加密

CREATE USER 'u'@'%' IDENTIFIED BY 'p' REQUIRE SSL; 只约束该用户,但其他用户仍可明文连接,且该用户若不带 SSL 参数仍会拒绝连接——它不改变协议默认行为。

  1. 要真正杜绝明文流量,得配合 require_secure_transport=ON(MySQL 5.7+),该参数让所有连接(无论用户)都必须走 SSL/TLS 或 Unix socket
  2. 注意:开启 require_secure_transport=ON 后,本地 mysql -u root -p(无 host)可能失败,因默认走 socket;需显式加 --protocol=tcp 并提供 SSL 参数
  3. 测试是否生效:连接后执行 STATUS;,看输出里 SSL: 行是否显示具体 cipher;或查 SELECT * FROM performance_schema.status_by_thread WHERE VARIABLE_NAME = 'Ssl_cipher';

实际生效的关键不在“配了多少”,而在 ssl_cipher 是否非空、ssl_mode 是否被客户端明确传递、以及私钥是否真的没密码——这三个点漏掉任何一个,连接都会静默降级到明文。

热门栏目