MongoDB4.2.8如何开启SSL连接

784 阅读4分钟

本文已参与 \lceil新人创作礼\rfloor 活动,一起开启掘金创作之路

最近公司在准备使用微软的cosmosdb,也就是微软的mongo数据库,这个数据库有个坑就是必须开启SSL连接,还没法关掉。所以研发们就像先在本地搞个环境先测试,所以我们就来活了。下面是开启mongo ssl连接的分享。

1. 生成证书

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天

  1. 使用RSA加密算法生成一个服务端私钥文件(OpenSSL通常使用PEM(Privacy Enbanced Mail)格式来保存私钥):
openssl genrsa -out server.key 2048

genrsa —— 使用RSA算法产生私钥

out——输出文件的路径

2048——指定私钥长度

  1. 根据密钥文件生成一个证书申请文件(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后缀

  1. 合并证书和私钥成PEM文件
cat server.key server.crt > server.pem
  1. 验证服务端证书
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
  1. 验证客户端证书
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端口:

设置用户名密码:

image.png

设置ca.pem和client.pem:

连接:

连接成功:

好了,已上就是关于mongodb如何开启ssl的分享,下期再见~~