使用Certbot证书配置Docker容器中MongoDB的SSL证书
MongoDB SSL证书配置解决方案
报错根因说明
你遇到的error:0909006C:PEM routines:get_name:no start line报错,核心原因是MongoDB要求的PEMKeyFile文件必须是私钥+完整证书链合并后的文件,无法直接使用Certbot默认生成的分离式证书文件。
具体配置步骤
步骤1:合并Certbot生成的证书
Certbot默认将域名证书存放在/etc/letsencrypt/live/你的数据库域名/目录下,执行以下命令合并所需文件到你挂载的./certs目录:
cat /etc/letsencrypt/live/你的数据库域名/privkey.pem /etc/letsencrypt/live/你的数据库域名/fullchain.pem > ./certs/mongo.pem
步骤2:修正证书文件权限
MongoDB对证书文件权限有严格要求,权限过高或所有者不正确都会导致读取失败:
# 限制文件仅所有者可读写 chmod 600 ./certs/mongo.pem # 999为MongoDB官方镜像默认运行用户的UID,确保容器内可正常读取 chown 999:999 ./certs/mongo.pem
步骤3:修改MongoDB配置文件
编辑./mongo-config/mongo.conf,对应配置如下:
net: port: 27017 bindIp: 0.0.0.0 ssl: mode: requireSSL PEMKeyFile: /data/certs/mongo.pem
注:如果你使用的是MongoDB 4.2及以上版本,推荐使用新版tls配置项,写法如下,功能完全一致:
net: port: 27017 bindIp: 0.0.0.0 tls: mode: requireTLS certificateKeyFile: /data/certs/mongo.pem
步骤4:配置证书自动续期钩子
Certbot生成的证书有效期为3个月,我们可以配置续期后自动更新MongoDB证书,避免手动操作:
- 新建续期钩子脚本
/etc/letsencrypt/renewal-hooks/post/update-mongo-cert.sh,内容如下:
#!/bin/bash # 替换为你的数据库域名 MONGO_DOMAIN="db.example.com" # 替换为你项目中certs目录的绝对路径 CERTS_PATH="/opt/mongo/certs" # 替换为你项目中docker-compose.yml所在目录的绝对路径 COMPOSE_PATH="/opt/mongo" # 合并新证书 cat /etc/letsencrypt/live/${MONGO_DOMAIN}/privkey.pem /etc/letsencrypt/live/${MONGO_DOMAIN}/fullchain.pem > ${CERTS_PATH}/mongo.pem # 修正权限 chmod 600 ${CERTS_PATH}/mongo.pem chown 999:999 ${CERTS_PATH}/mongo.pem # 重启MongoDB容器加载新证书 cd ${COMPOSE_PATH} docker-compose restart mongo
- 给脚本添加执行权限:
chmod +x /etc/letsencrypt/renewal-hooks/post/update-mongo-cert.sh
配置验证
启动MongoDB容器后,使用以下命令测试连接是否正常:
# 旧版MongoDB使用--ssl参数 mongo --host 你的数据库域名 --port 27017 --username exampleuser --password examplepassword --authenticationDatabase admin --ssl # 新版MongoDB使用--tls参数 mongo --host 你的数据库域名 --port 27017 --username exampleuser --password examplepassword --authenticationDatabase admin --tls
能正常进入Mongo shell即为配置成功。
常见排查点
- 确认合并证书时顺序正确:私钥在前,证书链在后,顺序颠倒会触发PEM格式错误
- 不要直接复制Certbot live目录下的软链接到certs目录,容器内无法读取宿主的软链接指向的真实路径
- 可进入容器执行
cat /data/certs/mongo.pem确认文件内容正常,是否存在-----BEGIN PRIVATE KEY-----和-----BEGIN CERTIFICATE-----的标准开头行
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

