基于安全性的考虑,我想使用TLS的方式来连接数据库。这一篇文章就是讲如何为运行在Docker的MongoDB配置TLS连接。
搜了两篇文章,讲的东西差不多,步骤看起来不难。我把整个流程走通之后,每一步都输入和输入都截图出来,以供大家在跟着文章操作时有一个参考。测试过程中遇到的问题当然记下来了,尽量确保跟着文章的步骤操作能一次成功 😁
阅读建议:文章截图有点多看起来有点长,可以先看目录把整个流程,实操的时候再细看每一个步骤内容
先运行下面的命令,进入到容器
# 如果容器未运行,需先启动mongodb的容器
docker start ch4_mongodb
docker exec -it ch4_mongodb bash
1. 生成服务端根证书
openssl req -out ca.pem -new -x509 -days 3650
# 此处会要求配置ca.pem密码,后续将会用到: mongodb_ch4_#A
# 或者用下面的方式加上证书相关的用户信息
# openssl req -**out** ca.pem -**new** -x509 -days 3650 -subj "/C=CN/ST=JS/O=AK/CN=root/emailAddress=srr@aok.com"
# -new:表示生成一个新证书签署请求
# -x509:专用于CA生成自签证书,如果不是自签证书则不需要此项
# -out:证书的保存路径
# -days:证书的有效期限,单位是day(天),默认是365天
# -subj:证书相关的用户信息(subject的缩写)
⚠️ 输入信息时Common Name 必须不同于步骤和下面 2.3 生成服务器端证书 输入的Common Name,否则校验时会报错。
error 18 at 0 depth lookup: self signed certificate
2. 生成服务端密钥
2.1 生成服务端私钥文件
openssl genrsa -out server.key 2048
# 使用RSA加密算法
# genrsa: 使用RSA算法产生私钥
# -out: 输出文件的路径
# 2048: 指定私钥长度
2.2 生成服务器端申请文件
openssl req -key server.key -new -out server.req
2.3 生成服务器端证书
openssl x509 -req -in server.req -CA ca.pem -CAkey privkey.pem -CAcreateserial -out server.crt -days 3650
2.4 合并服务器端私钥和服务器端证书,生成server.pem
cat server.key server.crt > server.pem
2.5 校验服务器端pem文件
openssl verify -CAfile ca.pem server.pem
3. mongod.conf 修改
在 net
下配置 tls
相关参数,证书ca.pem
和密钥server.pem
的路径都需要用实例中的路径。
这里有一点需要提一下,证书的路径是直接在 mongod.conf 使用的mongodb容器中的绝对路径,是因为生成证书需要用的 private.key
在容器里面。
我不确定能否在开发机器或者服务器的宿主机器上生存着里面用的所以证书和密钥,然后将容器中的证书和密钥路径 像 db和log文件一样填控制里面的路径,再用docker-compose映射起来。我想应该是可以的,留着后面测一测。
# Where and how to store data.
storage:
dbPath: /data/db
journal:
enabled: true
# directoryPerDB: true
# engine: wiredTiger
# wiredTiger:
# engineConfig:
# cacheSizeGB: 8
# directoryForIndexes: true
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# network interfaces
net:
# port: 27017
# bindIp: 0.0.0.0
# !!!配置这里
tls:
## 必须使用ssl连接
mode: requireTLS
# 必须使用绝对路径
certificateKeyFile: /server.pem
# 必须使用绝对路径
CAFile: /ca.pem
# 允许不可用主机名
allowInvalidHostnames: true
# 允许使用自签证书,如果使用自签证书必须配置该项,否则会认证失败
allowInvalidCertificates: true
# how the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo
# security settings
security:
authorization: enabled # enabled/disabled #开启客户端认证
然后 运行 docker-compose up
mongodb 应该就跑起来了,不会有错误信息
4. 客户端证书配置,生成client.pem
4.1 生成客户端私钥
openssl genrsa -out client.key 2048
4.2 生成客户端申请文件
openssl req -key client.key -new -out client.req
4.3 生成客户端证书
openssl x509 -req -in client.req -CA ca.pem -CAkey privkey.pem -CAserial ca.srl -out client.crt -days 3650
4.4 合并客户端私钥和客户端证书,生成client.pem
cat client.key client.crt > client.pem
4.5 校验客户端pem文件
openssl verify -CAfile ca.pem client.pem
使用下面的命令将在容器中生成的证书拷贝到客户端需要连接的机器上。
docker cp mongodb_ch4:/ca.pem /Users/mac/docker/mongodb/ch4/ca.pem
docker cp mongodb_ch4:/client.pem /Users/mac/docker/mongodb/ch4/client.pem
5. 客户端连接测试
我的机器上是用的 NoSQLBooster 测试的,配置截图如下Authenticaiton里面需要配置一个账号,否则连上后也无法查看数据库下的内容。如果新启动的MongoDB还未创建数据库,可以用docker-compose中配置的root用户的信息。