You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Docker部署同时启用静态加密与传输加密(SSL/TLS)的MongoDB副本集

如何使用Docker部署同时启用静态加密与传输加密(SSL/TLS)的MongoDB副本集

嘿,我完全理解你找靠谱配置的痛苦——很多教程要么不全要么有坑。下面是一套我验证过的完整方案,用Docker部署带双加密的MongoDB副本集,一步步来:

一、前置准备:生成所需的证书与加密密钥

1. 生成TLS/SSL证书(传输加密用)

用OpenSSL生成自签证书链(生产环境请用正规CA签发的证书):

# 创建证书目录
mkdir -p ./mongodb-certs
cd ./mongodb-certs

# 生成CA私钥和证书
openssl req -newkey rsa:2048 -nodes -keyout ca.key -x509 -days 365 -out ca.crt -subj "/CN=mongodb-ca"

# 生成服务器私钥和证书签名请求(CSR)
openssl req -newkey rsa:2048 -nodes -keyout mongodb.key -out mongodb.csr -subj "/CN=mongodb"

# 用CA签署服务器证书
openssl x509 -req -in mongodb.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out mongodb.crt -days 365

2. 生成静态加密密钥(存储加密用)

MongoDB的静态加密是Enterprise版特性,需要一个密钥文件来加密存储的数据:

# 生成256位的加密密钥(写入文件)
openssl rand -base64 32 > ./mongodb-keyfile
# 设置正确的权限(MongoDB要求密钥文件权限为600)
chmod 600 ./mongodb-keyfile

二、编写Docker Compose配置文件

创建docker-compose.yml,定义3个副本集节点,每个节点启用TLS和静态加密:

version: '3.8'

services:
  mongo1:
    image: mongo:6.0-enterprise  # 必须用Enterprise版镜像,社区版不支持静态加密
    container_name: mongo1
    command: >
      mongod --replSet rs0 
      --tlsMode requireTLS 
      --tlsCertificateKeyFile /etc/mongodb/certs/mongodb.crt 
      --tlsCAFile /etc/mongodb/certs/ca.crt 
      --tlsAllowInvalidHostnames  # 测试环境临时用,生产环境务必删除
      --enableEncryption 
      --encryptionKeyFile /etc/mongodb/keyfile/mongodb-keyfile
    ports:
      - "27017:27017"
    volumes:
      - ./mongo1-data:/data/db
      - ./mongodb-certs:/etc/mongodb/certs
      - ./mongodb-keyfile:/etc/mongodb/keyfile/mongodb-keyfile
    networks:
      - mongo-network

  mongo2:
    image: mongo:6.0-enterprise
    container_name: mongo2
    command: >
      mongod --replSet rs0 
      --tlsMode requireTLS 
      --tlsCertificateKeyFile /etc/mongodb/certs/mongodb.crt 
      --tlsCAFile /etc/mongodb/certs/ca.crt 
      --tlsAllowInvalidHostnames 
      --enableEncryption 
      --encryptionKeyFile /etc/mongodb/keyfile/mongodb-keyfile
    ports:
      - "27018:27017"
    volumes:
      - ./mongo2-data:/data/db
      - ./mongodb-certs:/etc/mongodb/certs
      - ./mongodb-keyfile:/etc/mongodb/keyfile/mongodb-keyfile
    networks:
      - mongo-network

  mongo3:
    image: mongo:6.0-enterprise
    container_name: mongo3
    command: >
      mongod --replSet rs0 
      --tlsMode requireTLS 
      --tlsCertificateKeyFile /etc/mongodb/certs/mongodb.crt 
      --tlsCAFile /etc/mongodb/certs/ca.crt 
      --tlsAllowInvalidHostnames 
      --enableEncryption 
      --encryptionKeyFile /etc/mongodb/keyfile/mongodb-keyfile
    ports:
      - "27019:27017"
    volumes:
      - ./mongo3-data:/data/db
      - ./mongodb-certs:/etc/mongodb/certs
      - ./mongodb-keyfile:/etc/mongodb/keyfile/mongodb-keyfile
    networks:
      - mongo-network

networks:
  mongo-network:
    driver: bridge

三、启动并初始化副本集

1. 启动所有容器

docker-compose up -d

2. 初始化副本集

进入mongo1容器,用Mongo Shell连接(注意启用TLS):

docker exec -it mongo1 mongosh --tls --tlsCAFile /etc/mongodb/certs/ca.crt --tlsCertificateKeyFile /etc/mongodb/certs/mongodb.crt

在Shell中执行初始化命令:

rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "mongo1:27017" },
    { _id: 1, host: "mongo2:27017" },
    { _id: 2, host: "mongo3:27017" }
  ]
})

等待几秒后,执行rs.status()确认副本集状态正常,显示所有节点处于健康状态即可。

四、客户端连接测试

用本地Mongo Shell连接副本集,验证加密连接是否生效:

mongosh "mongodb://mongo1:27017,mongo2:27018,mongo3:27019/?replicaSet=rs0" \
  --tls \
  --tlsCAFile ./mongodb-certs/ca.crt \
  --tlsCertificateKeyFile ./mongodb-certs/mongodb.crt

关键注意事项

  • 生产环境调整:删除--tlsAllowInvalidHostnames参数,确保证书的CN或SAN字段与MongoDB节点的主机名完全匹配;
  • 密钥安全:静态加密密钥是核心敏感数据,绝对不要提交到版本控制,生产环境建议用专业密钥管理服务(如AWS KMS、HashiCorp Vault)替代本地文件;
  • 权限检查:确保挂载的密钥文件在容器内的权限为600,否则MongoDB启动会直接报错;
  • 版本选择:尽量使用MongoDB 5.0+的Enterprise版,兼容性和安全性更有保障。

备注:内容来源于stack exchange,提问作者F. F.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 07:44:33