mysql ssl加密连接需同时满足服务端have_ssl=yes、用户权限含require ssl、客户端显式指定--ssl-mode=required三者,缺一不可,否则静默降级为明文。

证书路径必须与容器内实际挂载位置严格一致
MySQL启动时会校验证书文件的读取权限和路径有效性,ssl_ca、ssl_cert、ssl_key 三个配置项中的路径,必须指向容器内部真实可访问的绝对路径。常见错误是把宿主机路径(如 /home/user/certs/server-cert.pem)直接写进 my.cnf,而没意识到容器内该路径并不存在。
正确做法是:通过 volumes 将证书目录挂载到容器内统一位置(比如 /etc/mysql/ssl/),然后在配置中使用该容器内路径:
[mysqld] ssl-ca=/etc/mysql/ssl/ca.pem ssl-cert=/etc/mysql/ssl/server-cert.pem ssl-key=/etc/mysql/ssl/server-key.pem
- 挂载命令示例:
-v ./certs:/etc/mysql/ssl,确保./certs下有全部三个文件 - 不要修改默认证书存放目录(如
/var/lib/mysql下的自动生成证书),MySQL 8.0.42 对非默认路径的 TLS 初始化容错性差,日志中容易出现SSL_CTX_set_default_verify_paths failed - 文件权限需为
600或644,MySQL 不接受777或属主不匹配(如 root 写、mysql 用户读不到)
require_secure_transport = ON 之前必须确认 have_ssl = YES
启动容器后,先连进去执行 SHOW VARIABLES LIKE 'have_ssl';。如果返回 DISABLED,说明 SSL 模块根本没加载成功——此时强行设 require_secure_transport = ON 会导致 MySQL 启动失败或拒绝连接,而不是报错提示。
排查顺序应为:
- 检查
my.cnf中证书路径是否拼写正确(注意大小写,Linux 区分) - 进入容器执行
ls -l /etc/mysql/ssl/,确认文件存在且 mysql 用户有读权限 - 查看 MySQL 错误日志:
docker logs audit-mysql | grep -i ssl,重点关注Failed to initialize TLS或SSL library error - 临时注释掉
require_secure_transport,只保留证书配置,验证have_ssl是否变为YES
Docker Compose 中证书挂载和环境变量不能混用
官方镜像支持 MYSQL_TLS_MODE=REQUIRED 环境变量,但它只控制客户端连接行为,**不替代服务端证书配置**。这个变量不会自动启用服务端 SSL,也不会帮你生成或加载证书。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
也就是说:
-
MYSQL_TLS_MODE=REQUIRED单独使用 → 容器启动成功,但have_ssl仍为DISABLED,无法建立加密连接 - 只配
my.cnf证书 + 不设require_secure_transport→ 加密可用,但普通连接仍被允许 - 正确组合:证书挂载 +
my.cnf显式配置 +require_secure_transport = ON
别指望环境变量能“简化”证书配置,它只是个开关,不是替代方案。
客户端连接必须显式指定证书或跳过验证,否则会失败
当服务端启用 require_secure_transport = ON 后,任何未加密的 TCP 连接都会被拒绝,包括本地 mysql -u root -p 命令。这时候要么提供客户端证书,要么明确告诉客户端“我信任这个服务端证书”:
- 带 CA 验证连接:
mysql --ssl-ca=/path/to/ca.pem -u root -p - 跳过验证(仅测试用):
mysql --ssl-mode=REQUIRED -u root -p(依赖 MySQL 8.0+ 默认行为) - Java 应用连接串需加参数:
&useSSL=true&requireSSL=true&verifyServerCertificate=false(生产环境应设为true并提供trustCertificateKeyStoreUrl)
最容易忽略的是:Docker 容器内执行的初始化脚本(/docker-entrypoint-initdb.d/*.sql)也会受此限制,若脚本里有连接操作,必须提前配置好客户端 SSL 参数,否则初始化会卡住或失败。










