如何使用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.
相关产品推荐
相关产品推荐

