- 数据库
- 灾备
【免费下载链接】databasus
PostgreSQL backup tool with Point-In-Time-Recovery and restore verification
本文以 Databasus 仓库中 MongoDB SSL 测试证书说明文档(backend/internal/features/tests/logical/mongodb/testdata/ssl/README.md)为主体,完整讲解这套测试证书的设计取舍与再生成方法,并结合同仓库的容器启动代码、SSL 端到端测试与生产连接 URI 构建逻辑,展示一条"证书文件 → mongod TLS 参数 → 备份/恢复全流程"的完整证据链。读完后你将掌握:如何在测试环境中正确配置 MongoDB 的requireTLS模式、自签名证书文件与 mongod 启动参数的对应关系,以及 Databasus 如何通过IsHttps开关在备份与恢复两个阶段复用同一套 TLS 连接逻辑。
测试证书的定位:为什么自签名就够了
该目录下的server.crt/server.pem是一套自签名证书与私钥,专门服务于 MongoDB SSL 测试(由containers.StartMongodbSSL启动),不用于生产环境。
README 明确说明了这一设计取舍的关键点:证书虽然按CN=localhost签发,但 SSL 测试连接时使用了tlsInsecure参数——客户端不做证书校验,因此任何自签名证书都能工作。这意味着测试的关注点不在"证书链是否可信",而在"TLS 通道是否真正建立、备份与恢复能否在加密通道上完成"。
这个测试侧的tlsInsecure并非孤例,它与生产侧代码是呼应的。在 MongoDB 数据库模型backend/internal/features/databases/databases/mongodb/model.go中,buildURI方法(约 L563-L611)负责拼装驱动与 mongodump/mongorestore 使用的连接 URI:
extraParams := "" if m.IsHttps { extraParams += "&tls=true&tlsInsecure=true" } else { extraParams += "&tls=false" }也就是说,当用户在 Databasus 中为 MongoDB 数据库开启IsHttps时,系统实际下发的连接串同样带有tls=true&tlsInsecure=true——加密通道强制建立,证书身份校验则交给用户自行的网络信任边界处理。测试用例使用tlsInsecure连接,正是与这条生产连接路径保持行为一致。
如何再生成测试证书
README 给出了完整的再生成步骤(需在该testdata/ssl/目录下执行):
openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 3650 -nodes -subj "/CN=localhost" cat server.crt server.key > server.pem rm server.key各参数含义:
-x509 -newkey rsa:2048:生成自签名证书 + 2048 位 RSA 私钥;-days 3650:有效期 10 年,测试资产无需频繁轮换;-nodes:私钥不加密(测试进程无法交互式输入口令);-subj "/CN=localhost":主体名设为 localhost;- 第二条命令把证书与私钥拼接为
server.pem,随后删除独立私钥文件。
两个证书文件与 mongod 启动参数的一一映射
README 对目录内两个文件的作用定义非常明确:
| 文件 | 用途 | 对应 mongod 参数 |
|---|---|---|
server.pem | 证书 + 私钥合并文件 | --tlsCertificateKeyFile |
server.crt | 纯证书 | --tlsCAFile |
这一映射在容器启动代码中可以直接验证。backend/internal/util/testing/containers/mongodb.go中的StartMongodbSSL(约 L78-L103)通过 testcontainers 启动mongo:8.2.3-noble镜像,并把两个文件拷入容器:
Files: []testcontainers.ContainerFile{ {HostFilePath: pemPath, ContainerFilePath: "/etc/ssl-test/server.pem", FileMode: 0o644}, {HostFilePath: crtPath, ContainerFilePath: "/etc/ssl-test/server.crt", FileMode: 0o644}, }, Cmd: []string{ "mongod", "--auth", "--tlsMode", "requireTLS", "--tlsCertificateKeyFile", "/etc/ssl-test/server.pem", "--tlsCAFile", "/etc/ssl-test/server.crt", "--tlsAllowConnectionsWithoutCertificates", },有三个值得注意的实现细节:
--tlsMode requireTLS:服务器强制所有连接走 TLS,非 TLS 客户端会被直接拒绝——这正是本测试要保护的前提。--tlsAllowConnectionsWithoutCertificates:允许客户端不提供客户端证书(即只做单向 TLS),与测试客户端只使用tlsInsecure而不携带客户端证书的做法匹配。若缺少该参数,仅requireTLS的默认行为可能要求客户端出示证书。- 就绪判定不是简单的端口探测。同一文件中的
mongodbReady()注释解释了原因:官方镜像的 entrypoint 会启动两次 mongod(先在 127.0.0.1 上创建 root 用户,再在 0.0.0.0 上监听)。Docker 端口代理在第一次启动期间就会接受映射端口的连接,仅凭端口检查会拿到一个随即被重置的连接。因此就绪策略要求Waiting for connections日志出现 2 次且端口监听,并给出了 240 秒的宽限启动超时(注释说明go test -p=N并发拉起多个 mongod 时冷启动会被 CPU 争抢拖慢)。
SSL 端到端测试:备份与恢复全流程
backend/internal/features/tests/logical/mongodb/ssl_test.go中的Test_BackupAndRestoreMongodbSSL_Succeeds(约 L34-L109)是这套证书的完整消费方,其流程为:
- 启动 TLS 容器:
containers.StartMongodbSSL(t, "testdata/ssl/server.pem", "testdata/ssl/server.crt"); - 直连验证:用
mongodb://root:rootpassword@host:port/testdb?authSource=admin&tls=true&tlsInsecure=true&serverSelectionTimeoutMS=5000连接并 Ping,确认加密通道可通; - 通过 API 注册数据库:请求体中显式设置
IsHttps: true(createMongodbSSLDatabaseViaAPI),这与生产模型字段一致; - 开启备份并创建备份:
EnableBackupsViaAPI+CreateBackupViaAPI,随后等待备份进入BackupStatusCompleted(上限 5 分钟); - 恢复到新库:以随机名
restoreddb_mongo_ssl_<8位uuid>为目标发起恢复请求,恢复请求同样携带IsHttps: true,等待RestoreStatusCompleted; - 数据完整性校验:
verifyMongodbDataIntegrity比对源库与恢复库数据; - 清理:删除恢复库、备份产物文件与 API 资源。
该测试的价值在于:它不是孤立地"连一次 TLS",而是把 TLS 通道贯穿了 mongodump 备份与 mongorestore 恢复两条完整链路。
生产侧:BuildConnectionURI 与 BuildRestoreURI 的分工
理解测试与生产的一致性,还取决于 URI 构建的两个入口(model.go约 L546-L561):
BuildConnectionURI:连接串路径中内嵌数据库名,供 Go 驱动与mongodump使用。注释说明这样做的动机是让mongodump不再需要--db参数——更严格的 mongodump 版本会拒绝--uri与--db同时出现;BuildRestoreURI:路径中不含数据库名。注释指出mongorestore会把 URI 中内嵌的库名当作隐式目标改写,与--nsFrom/--nsTo冲突,静默地产出零文档的恢复结果。
两条 URI 都会经过上文buildURI中的IsHttps分支,因此 SSL 测试同时覆盖了备份与恢复阶段的 TLS 参数拼装——这正是测试中两处请求都带IsHttps: true的原因。
与其他数据库 SSL 测试的边界
README 最后一段划清了文件边界,避免测试资产被误用:
- MariaDB / MySQL:SSL 测试不使用这套证书文件,对应测试镜像自行生成证书,并依靠
--require_secure_transport=ON拒绝非 TLS 客户端。其测试侧配套是backend/internal/features/tests/logical/shared/ssl.go中为 Go MySQL 驱动注册的ssl-test-skip-verifyTLS 配置(InsecureSkipVerify: true,用sync.Once防止重复注册导致驱动 panic); - PostgreSQL:SSL 与 mTLS 的 fixture 位于
backend/internal/features/tests/logical/postgresql/testdata/ssl/与.../testdata/mtls/,包含Dockerfile、pg_hba.conf、CA 与客户端证书等更完整的资产,与本目录的单文件自签名方案不同。
小结与实践提示
这套 MongoDB SSL 测试资产的设计思路可以概括为:测试证书只负责"建立加密通道",身份信任问题交给tlsInsecure显式放弃。生产代码中IsHttps → tls=true&tlsInsecure=true的 URI 拼装逻辑(backend/internal/features/databases/databases/mongodb/model.go)与测试行为同构,使 SSL 测试对生产路径具有直接的回归价值。
实践中的两个注意点:
- 若你复制该方案到自有测试环境,
server.pem(证书 + 私钥)与server.crt(CA 文件)的分工不可互换:--tlsCertificateKeyFile需要合并文件,--tlsCAFile只接收证书; tlsInsecure意味着放弃证书校验,这适合隔离测试环境与内网受信链路;对需要校验服务端身份的部署,应从源码结构看,当前仓库的生产连接路径同样未提供证书校验参数,使用者应依赖网络层信任边界或自行扩展。
关键文件索引:测试证书说明、合并证书、纯证书、SSL 端到端测试、TLS 容器启动、连接 URI 构建。
- 数据库
- 灾备
【免费下载链接】databasus
PostgreSQL backup tool with Point-In-Time-Recovery and restore verification
相关推荐
Nomad TLS 证书生成实战:用 `nomad tls` 命令创建自签名证书与测试证书
Nomad TLS 证书生成实战:用 nomad tls 命令创建自签名证书与测试证书 本指南围绕 Nomad 仓库中 helper/tlsutil/testd
任务调度云原生运维后端HTTPX SSL/TLS 验证完全指南:verify 参数、自定义 CA 与客户端证书实战
HTTPX SSL/TLS 验证完全指南:verify 参数、自定义 CA 与客户端证书实战 导读 HTTPX 作为面向 Python 的下一代 HTTP 客户
后端网络KEDA Apache Pulsar Scaler 端到端测试的 TLS 配置:自签名证书生成与测试原理深度解析
KEDA Apache Pulsar Scaler 端到端测试的 TLS 配置:自签名证书生成与测试原理深度解析 本篇技术指南围绕 KEDA 仓库中 Apach
云原生容器编排
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考