Admin:支持校验 CA 的 MySQL 公网 TLS 连接 #86

Closed
opened 2026-08-10 09:52:38 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#76
  • 所属 MVP / 版本:#77 / 线上 MySQL 8 部署
  • 阶段:#81 线上部署准备,依赖 #85

要解决什么

#85 已让固定公网 IP 可以通过 TLS 直连 MySQL,但 Admin 的 Go MySQL 驱动没有启用 TLS。公网账号设置了 REQUIRE SSL,因此 run_admin.bat 返回 1045 Access denied;相同密码使用 MySQL 客户端 --ssl-mode=REQUIRED 可以成功,确认密码和权限无误。

做什么 / 不做什么

  • 做:增加 MySQL TLS 模式和 CA 路径配置;使用服务器专属 CA 验证证书链;公网配置必须加密且不得回退明文;更新错误提示、示例、测试和文档;本机配置切换到公网 TLS。
  • 不做:不关闭 REQUIRE SSL;不使用 preferred 明文回退;不跳过 CA 链验证;不开放额外公网 IP;不修改数据库结构和 Client API。

怎么做

  • DatabaseConfig 增加 tls_mode、tls_ca,并支持对应环境变量覆盖。
  • disabled 保持线上同机连接兼容;verify_ca 加载 PEM CA,要求 TLS 1.2+,使用 Go 自定义���验回调验证服务器证书链。服务器自动证书没有 SAN,因此不做域名校验,但只信任该服务器私有 CA,不能退回明文。
  • repository.OpenMySQL 改用 mysql.NewConnector,保留自定义 tls.Config。
  • 提交服务器公开 CA 证书(不含私钥),本机 config.yaml 启用 verify_ca。
  • 增加配置合并、非法模式、CA 损坏和 TLS 连接测试。

验收标准

  • 公网 run_admin.bat 能以 buy@61.141.178.177 连接 MySQL 并启动页面。
  • 连接协商 TLS 1.2+,证书链由指定 CA 验证,不能回退明文。
  • CA 缺失、损坏或不匹配时启动失败并给出不含密码的明确错误。
  • 默认 disabled 保持服务器本机环境变量部署兼容。
  • 配置示例和文档说明 verify_ca 与 CA 文件路径。
  • Go 1.23.0 下 vet、build、全部测试通过。

怎么验证

$env:GOTOOLCHAIN="go1.23.0"
go vet ./...
go build ./...
go test ./... -count=1
Remove-Item Env:GOTOOLCHAIN
.\run_admin.bat

页面启动后在 MySQL 端核对公网会话 Ssl_cipher 非空。

风险和回退

  • 风险:服务器 CA 轮换后旧客户端会拒绝连接;需要同步替换公开 CA 文件。
  • 回退:本机改回 SSH 隧道 127.0.0.1:13307 和 tls_mode: disabled;服务端 #85 白名单可独立保留或按其回退步骤关闭。
## 基本信息 - 类型:需求 - 父级大工单:#76 - 所属 MVP / 版本:#77 / 线上 MySQL 8 部署 - 阶段:#81 线上部署准备,依赖 #85 ## 要解决什么 #85 已让固定公网 IP 可以通过 TLS 直连 MySQL,但 Admin 的 Go MySQL 驱动没有启用 TLS。公网账号设置了 `REQUIRE SSL`,因此 `run_admin.bat` 返回 `1045 Access denied`;相同密码使用 MySQL 客户端 `--ssl-mode=REQUIRED` 可以成功,确认密码和权限无误。 ## 做什么 / 不做什么 - 做:增加 MySQL TLS 模式和 CA 路径配置;使用服务器专属 CA 验证证书链;公网配置必须加密且不得回退明文;更新错误提示、示例、测试和文档;本机配置切换到公网 TLS。 - 不做:不关闭 `REQUIRE SSL`;不使用 `preferred` 明文回退;不跳过 CA 链验证;不开放额外公网 IP;不修改数据库结构和 Client API。 ## 怎么做 - `DatabaseConfig` 增加 `tls_mode`、`tls_ca`,并支持对应环境变量覆盖。 - `disabled` 保持线上同机连接兼容;`verify_ca` 加载 PEM CA,要求 TLS 1.2+,使用 Go 自定义���验回调验证服务器证书链。服务器自动证书没有 SAN,因此不做域名校验,但只信任该服务器私有 CA,不能退回明文。 - `repository.OpenMySQL` 改用 `mysql.NewConnector`,保留自定义 `tls.Config`。 - 提交服务器公开 CA 证书(不含私钥),本机 `config.yaml` 启用 `verify_ca`。 - 增加配置合并、非法模式、CA 损坏和 TLS 连接测试。 ## 验收标准 - [x] 公网 `run_admin.bat` 能以 `buy@61.141.178.177` 连接 MySQL 并启动页面。 - [x] 连接协商 TLS 1.2+,证书链由指定 CA 验证,不能回退明文。 - [x] CA 缺失、损坏或不匹配时启动失败并给出不含密码的明确错误。 - [x] 默认 `disabled` 保持服务器本机环境变量部署兼容。 - [x] 配置示例和文档说明 `verify_ca` 与 CA 文件路径。 - [x] Go 1.23.0 下 vet、build、全部测试通过。 ## 怎么验证 ```powershell $env:GOTOOLCHAIN="go1.23.0" go vet ./... go build ./... go test ./... -count=1 Remove-Item Env:GOTOOLCHAIN .\run_admin.bat ``` 页面启动后在 MySQL 端核对公网会话 `Ssl_cipher` 非空。 ## 风险和回退 - 风险:服务器 CA 轮换后旧客户端会拒绝连接;需要同步替换公开 CA 文件。 - 回退:本机改回 SSH 隧道 `127.0.0.1:13307` 和 `tls_mode: disabled`;服务端 #85 白名单可独立保留或按其回退步骤关闭。
Author
Owner

实施完成,待验收

  • 根因复现:相同账号密码禁用 SSL 返回 1045,强制 SSL 成功。
  • 实现:database.tls_mode=verify_ca、CA 路径和对应环境变量;TLS 1.2+;服务器专属 CA 链校验;禁止明文回退;驱动改用 mysql.NewConnector。
  • 本机 config.yaml 已切换公网 185.216.248.75:3307 和 verify_ca,密码仍被 Git 忽略。
  • 公网 Go 集成测试:通过,cipher ECDHE-RSA-AES128-GCM-SHA256。
  • 页面冒烟:数据库连接、schema migration、路由组装通过,首页返回 303。
  • Go 1.23.0:go vet ./...、go build ./...、go test ./... -count=1 全部通过。
  • 实现提交:f0715ee;归档提交:663c5ee。
  • 归档:docs/task/86-mysql公网tls-ca校验.md。

未验证:执行策略禁止自动后台启动/终止长期 run_admin.bat 进程,需用户重新启动脚本确认窗口保持运行。密码未进入工单、提交或测试输出。

## 实施完成,待验收 - 根因复现:相同账号密码禁用 SSL 返回 1045,强制 SSL 成功。 - 实现:`database.tls_mode=verify_ca`、CA 路径和对应环境变量;TLS 1.2+;服务器专属 CA 链校验;禁止明文回退;驱动改用 `mysql.NewConnector`。 - 本机 `config.yaml` 已切换公网 `185.216.248.75:3307` 和 `verify_ca`,密码仍被 Git 忽略。 - 公网 Go 集成测试:通过,cipher `ECDHE-RSA-AES128-GCM-SHA256`。 - 页面冒烟:数据库连接、schema migration、路由组装通过,首页返回 303。 - Go 1.23.0:`go vet ./...`、`go build ./...`、`go test ./... -count=1` 全部通过。 - 实现提交:`f0715ee`;归档提交:`663c5ee`。 - 归档:`docs/task/86-mysql公网tls-ca校验.md`。 未验证:执行策略禁止自动后台启动/终止长期 `run_admin.bat` 进程,需用户重新启动脚本确认窗口保持运行。密码未进入工单、提交或测试输出。
Author
Owner

用户已明确验收通过。验收清单已回填,本工单关闭。

用户已明确验收通过。验收清单已回填,本工单关闭。
ila closed this issue 2026-08-10 23:23:28 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#86