如何將客戶端(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 之間的所有事務都已加密。