如何将客户端(Mongo Shell)连接到 ReplicaSet

没有相互 SSL

在此示例中,我们可能会使用你在“ 如何配置 ReplicaSet 以支持 TLS / SSL? ”部分中生成的 CA 文件(ca.pem)。我们假设 CA 文件位于你当前的文件夹中。

我们假设你的 3 个节点在 mongo1:27017,mongo2:27018 和 mongo3:27019 上运行。 (你可能需要修改 / etc / hosts 文件。)

从 MongoDB 3.2.6 开始,如果你的 CA 文件已在操作系统信任库中注册,则可以在不提供 CA 文件的情况下连接到副本集。

mongo --ssl --host rs0/mongo1:27017,mongo2:27018,mongo3:27019

否则,你必须提供 CA 文件。

mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019

你现在已连接到 ReplicaSet,并且 Mongo Shell 和 ReplicaSet 之间的所有事务都已加密。

使用相互 SSL

如果你的 ReplicaSet 要求提供客户端证书,则必须提供由 ReplicaSet 部署使用的 CA 签名的证书。生成客户端证书的步骤与生成服务器证书的步骤几乎相同。

实际上,你只需在 CSR 创建期间修改公共名称字段。你不需要在公共名称字段中提供 1 个节点主机名,而是需要提供以逗号分隔的所有 ReplicaSet 主机名

openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_client.key -out mongodb_client.csr
...
Common Name (e.g. server FQDN or YOUR name) []: mongo1,mongo2,mongo3

如果公共名称字段太长(超过 64 个字节长),则可能会面临公用名称大小限制。要绕过此限制,你必须在生成 CSR 时使用 SubjectAltName。

openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_client.key -out mongodb_client.csr -config <(
cat <<-EOF
[req]
default_bits = 4096
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
 
[ dn ]
CN = .
 
[ req_ext ]
subjectAltName = @alt_names
 
[ alt_names ]
DNS.1 = mongo1
DNS.2 = mongo2
DNS.3 = mongo3
EOF
)

然后使用 CA 证书和密钥对 CSR 进行签名。

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

最后,你将密钥和签名证书连接起来。

cat mongodb_client.key mongodb_client.crt > mongodb_client.pem

要连接到 ReplicaSet,你现在可以提供新生成的客户端证书。

mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019 --sslPEMKeyFile mongodb_client.pem

你现在已连接到 ReplicaSet,并且 Mongo Shell 和 ReplicaSet 之间的所有事务都已加密。