如何配置 ReplicaSet 以支持 TLSSSL

创建根证书

根证书(又名 CA 文件)将用于签署和识别你的证书。要生成它,请运行以下命令。

openssl req -nodes -out ca.pem -new -x509 -keyout ca.key

仔细保留根证书及其密钥,两者都将用于签署你的证书。根证书也可能由你的客户使用。

生成证书请求和私钥

生成证书签名请求(即 CSR)时,**在公共名称(又称 CN)字段中输入节点的确切主机名(或 IP)。其他字段必须具有完全相同的值。**你可能需要修改 / etc / hosts 文件。

以下命令将生成 CSR 文件和 RSA 私钥(4096 位)。

openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_1.key -out mongodb_node_1.csr
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_2.key -out mongodb_node_2.csr
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_3.key -out mongodb_node_3.csr

你必须为 ReplicaSet 的每个节点生成一个 CSR。请记住,从一个节点到另一个节点的公共名称不同。不要将多个 CSR 基于同一私钥

你现在必须拥有 3 个 CSR 和 3 个私钥。

mongodb_node_1.key - mongodb_node_2.key - mongodb_node_3.key
mongodb_node_1.csr - mongodb_node_2.csr - mongodb_node_3.csr

签署你的证书申请

使用先前生成的 CA 文件(ca.pem)及其私钥(ca.key)通过运行以下命令对每个证书请求进行签名。

openssl x509 -req -in mongodb_node_1.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_1.crt
openssl x509 -req -in mongodb_node_2.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_2.crt
openssl x509 -req -in mongodb_node_3.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_3.crt

你必须签署每个 CSR

你现在必须拥有 3 个 CSR,3 个私钥和 3 个自签名证书。MongoDB 将仅使用私钥和证书。

mongodb_node_1.key - mongodb_node_2.key - mongodb_node_3.key
mongodb_node_1.csr - mongodb_node_2.csr - mongodb_node_3.csr
mongodb_node_1.crt - mongodb_node_2.crt - mongodb_node_3.crt

每个证书对应一个节点。请仔细记住你为每个 CSR 提供的 CN /主机名

Concat 每个节点证书及其密钥

运行以下命令将每个节点证书与其密钥连接在一个文件中(MongoDB 要求)。

cat mongodb_node_1.key mongodb_node_1.crt > mongodb_node_1.pem
cat mongodb_node_2.key mongodb_node_2.crt > mongodb_node_2.pem
cat mongodb_node_3.key mongodb_node_3.crt > mongodb_node_3.pem

你现在必须有 3 个 PEM 文件。

mongodb_node_1.pem - mongodb_node_2.pem - mongodb_node_3.pem

部署副本集

我们假设你的 pem 文件位于当前文件夹以及 data / data1,data / data2 和 data / data3 中。

运行以下命令以部署 3 节点 ReplicaSet 侦听端口 27017,27018 和 27019。

mongod --dbpath data/data_1 --replSet rs0 --port 27017 --sslMode requireSSL --sslPEMKeyFile mongodb_node_1.pem
mongod --dbpath data/data_2 --replSet rs0 --port 27018 --sslMode requireSSL --sslPEMKeyFile mongodb_node_2.pem
mongod --dbpath data/data_3 --replSet rs0 --port 27019 --sslMode requireSSL --sslPEMKeyFile mongodb_node_3.pem

你现在在本地环境中部署了 3 个节点 ReplicaSet,并且所有事务都已加密。如果不使用 TLS,则无法连接到此 ReplicaSet。

部署 ReplicaSet 以实现相互 SSL /相互信任

要强制客户端提供客户端证书(Mutual SSL),你必须在运行实例时添加 CA 文件。

mongod --dbpath data/data_1 --replSet rs0 --port 27017 --sslMode requireSSL --sslPEMKeyFile mongodb_node_1.pem --sslCAFile ca.pem
mongod --dbpath data/data_2 --replSet rs0 --port 27018 --sslMode requireSSL --sslPEMKeyFile mongodb_node_2.pem --sslCAFile ca.pem
mongod --dbpath data/data_3 --replSet rs0 --port 27019 --sslMode requireSSL --sslPEMKeyFile mongodb_node_3.pem --sslCAFile ca.pem

你现在在本地环境中部署了 3 个节点 ReplicaSet,并且所有事务都已加密。如果不使用 TLS 或未提供 CA 信任的客户端证书,则无法连接到此副本集。