本文已参与 新人创作礼 活动,一起开启掘金创作之路
最近公司在准备使用微软的cosmosdb,也就是微软的mongo数据库,这个数据库有个坑就是必须开启SSL连接,还没法关掉。所以研发们就像先在本地搞个环境先测试,所以我们就来活了。下面是开启mongo ssl连接的分享。
1. 生成证书
1.1 服务端
- 生成根证书
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天
- 使用RSA加密算法生成一个服务端私钥文件(OpenSSL通常使用PEM(Privacy Enbanced Mail)格式来保存私钥):
openssl genrsa -out server.key 2048
genrsa —— 使用RSA算法产生私钥
out——输出文件的路径
2048——指定私钥长度
- 根据密钥文件生成一个证书申请文件(csr文件),注意IP要写对,写localhost会有问题
openssl req -key server.key -new -out server.req -subj "/C=CN/ST=JS/O=AK/CN=server1/CN=172.16.102.21/emailAddress=srr@aok.com"
req——执行证书签发命令
-new——新证书签发请求
-key——指定私钥路径
-out——输出的csr文件的路径
-subj——证书相关的用户信息(subject的缩写)
4、根据证书申请文件生成CA的服务端证书文件
openssl x509 -req -in server.req -CA ca.pem -CAkey privkey.pem -CAcreateserial -out server.crt -days 3650
-CA——指定CA证书的路径
-CAkey——指定CA证书的私钥路径
-CAcreateserial——表示创建证书序列号文件,创建的序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀
- 合并证书和私钥成PEM文件
cat server.key server.crt > server.pem
- 验证服务端证书
openssl verify -CAfile ca.pem server.pem
1.2 客户端
1、使用RSA加密算法生成一个客户端私钥文件
ope1,nssl genrsa -out client.key 2048
genrsa —— 使用RSA算法产生私钥
out——输出文件的路径
2048——指定私钥长度
2、据密钥文件生成一个证书申请文件
openssl req -key client.key -new -out client.req -subj "/C=CN/ST=JS/O=AK/CN=client1/emailAddress=srr@oka.com"
req——执行证书签发命令
-new——新证书签发请求
-key——指定私钥路径
-out——输出的csr文件的路径
-subj——证书相关的用户信息(subject的缩写)
3、据证书申请文件生成CA的客户端证书文件
openssl x509 -req -in client.req -CA ca.pem -CAkey privkey.pem -CAserial ca.srl -out client.crt -days 3650
-CA——指定CA证书的路径
-CAkey——指定CA证书的私钥路径
-CAserial——指定证书序列号文件的路径(这里使用在创建服务器端证书文件时创建的序列号文件即可)
4、合并证书及私钥文件成PEM文件
cat client.key client.crt > client.pem
- 验证客户端证书
openssl verify -CAfile ca.pem client.pem
2. 部署mongo
1、docker-comopse
# cat docker-compose.yaml
version: "3"
services:
mongo:
image: mongo:4.2.8
container_name: mongodb
hostname: mongodb
restart: always
tty: true
ports:
- 27017:27017
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: Mongo@aok.com2022
volumes:
- /etc/localtime:/etc/localtime:ro
- ./data:/data/db
- ./log:/data/log
- ./mongod.conf:/etc/mongod.conf
- ./cert/ca.pem:/etc/ca.pem
- ./cert/server.pem:/etc/server.pem
command:
- /bin/bash
- -c
- mongod --auth --config /etc/mongod.conf
2、配置文件 mongod.conf
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /data/db
# journal:
# enabled: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/log/db.log
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
net:
tls:
## 必须使用ssl连接
mode: requireTLS
# 必须使用绝对路径
certificateKeyFile: /etc/server.pem
# 必须使用绝对路径
CAFile: /etc/ca.pem
# 允许不可用主机名
allowInvalidHostnames: true
# 允许使用自签证书,如果使用自签证书必须配置该项,否则会认证失败
allowInvalidCertificates: true
# how the process runs
#processManagement:
# timeZoneInfo: /usr/share/zoneinfo
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
3、启动
docker-compose up -d
4、创建用户
# docker exec -it mongodb /bin/bash
mongo --tlsAllowInvalidCertificates --tlsAllowInvalidHostnames --tls --tlsCertificateKeyFile /etc/server.pem --tlsCAFile /etc/ca.pem --host 172.16.102.21
> use admin
> db.createUser({
user: "admin",
pwd: "Mongo@aok.com2022",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})
> db.auth('admin','Mongo@aok.com2022')
返回1表示OK
3. 终端测试
docker exec -it mongodb /bin/bash
mongo --tlsAllowInvalidCertificates --tlsAllowInvalidHostnames --tls --tlsCertificateKeyFile /etc/server.pem --tlsCAFile /etc/ca.pem --host 172.16.102.21
>use admin;
> db.auth('admin','Mongo@aok.com2022')
> show dbs
TLS选项(4.2中的新增功能)
--tls 启用TLS / SSL连接。
--tlsCertificateKeyFile 指定.pem包含mongo要提交给mongod或mongos实例的外壳程序证书和密钥的文件 。
--tlsCertificateKeyFilePassword 如果mongo外壳的证书密钥文件进行加密。
--tlsCAFile 指定.pem用于验证由mongod或mongos实例提供的证书的证书颁发机构(CA)文件 。
--tlsCertificateSelector 如果在Windows或macOS上运行,请使用系统证书存储中的证书。(版本4.0中的新功能)
4. robot3t测试
填好IP端口:
设置用户名密码:
设置ca.pem和client.pem:
连接:
连接成功:
好了,已上就是关于mongodb如何开启ssl的分享,下期再见~~