mongodb - 在没有证书的情况下在 mongodb 副本集中启用 ssl

标签 mongodb ssl

我正在尝试使用 ssl 设置 mongodb 2.6.8 副本集。我使用 ssl 支持手动编译了 mongo,并在我的配置中启用了 ssl,如下所示:

sslMode=requireSSL
sslPEMKeyFile=/etc/ssl/mongodb.pem
sslCAFile=/etc/ssl/client.pem
sslWeakCertificateValidation=true
replSet=rs0

我在每台服务器上创建了运行 openssl 的 mongodb.pem 和 client.pem 文件,如下所示:

# openssl req -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key -subj '/C=US/ST=MA/L=Waltham/CN=<fully qualified domain name>'
# cat mongodb-cert.key mongodb-cert.crt > mongodb.pem
# openssl req -new -x509 -days 365 -nodes -out client-cert.crt -keyout client-cert.key -subj '/C=US/ST=MA/L=Waltham/CN=<fully qualified domain name>'
# cat client-cert.key client-cert.crt > client.pem

在每台服务器上,我可以确认证书和 ssl 正在工作,因为在我的每台服务器上,我可以执行以下操作:

mongo --ssl --sslPEMKeyFile=/etc/ssl/client.pem --sslCAFile=/etc/ssl/mongodb.pem <fully qualified domain name>

让我进入 mongo shell。

在主节点上,我可以执行 rs.initiate() 和 rs.status(),看起来不错:

> rs.initiate()
{
    "info2" : "no configuration explicitly specified -- making one",
    "me" : "<fqdn node 1>:27017",
    "info" : "Config now saved locally.  Should come online in about a minute.",
    "ok" : 1
}
> rs.status()
{
    "set" : "rs0",
    "date" : ISODate("2015-04-02T20:25:27Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "<fqdn node 1>:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 23,
            "optime" : Timestamp(1428006318, 1),
            "optimeDate" : ISODate("2015-04-02T20:25:18Z"),
            "electionTime" : Timestamp(1428006318, 2),
            "electionDate" : ISODate("2015-04-02T20:25:18Z"),
            "self" : true
        }
    ],
    "ok" : 1
}

但是,当我尝试添加第二个成员时,出现了可怕的 13144 错误:

rs0:PRIMARY> rs.add("<fqdn node 2>:27017")
{
    "errmsg" : "exception: need most members up to reconfigure, not ok : <fqdn node 2>:27017",
    "code" : 13144,
    "ok" : 0
}

我还应该注意到两台主机之间的连接工作正常,即在节点 1 上:

mongo --ssl --host <fqdn node 2>

或在节点 2 上时:

mongo --ssl --host <fqdn node 1>

两者都有效。

如何将 ssl 选项和/或证书传递给 rs.add() 命令?

我实际上并不关心传递证书(这就是我指定 sslWeakCertificateValidation=true 的原因);我更关心确保节点之间的通信在 ssl 中。

最佳答案

很难确定哪里出了问题,但我有一些观察结果:

  1. 如果另一个 mongod 进程启动时没有其配置中的 replSet=rs0
  2. 您可能会遇到该错误,因为服务器无法在端口 27017 上通信,例如如果防火墙阻止了它们。值得通过在每台服务器上将 mongo 客户端连接到另一台服务器来验证连接。
  3. 您的 mongod.pem 文件有问题。您已通过连接服务器的私钥和证书来创建它;但它应该包含 key 。它应该只是一个递增的证书链,从服务器开始到根结束。如果服务器是自认证的,则无需连接任何其他内容。

关于mongodb - 在没有证书的情况下在 mongodb 副本集中启用 ssl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29422171/

相关文章:

node.js - 使用 $or 时出现 MongoError : TypeError: Cannot read property 'id' of undefined,

azure - 尝试为 Azure Web App 添加 SSL 绑定(bind)时没有证书

android - 带 Volley 的 SSL 固定

shell - 错误 : site default-ssl not properly enabled

ssl - Golang - 跳过 SSL/x509 验证和构建包?

node.js - 聚合查找中面临的问题。需要查找结果与定义的结构相同

javascript - 使用nodejs,一个用户的更改可以同时反射(reflect)到其他用户

mongodb - 为什么在实际查询只需要几毫秒时获取 MongoDB 结果却很慢?

ssl - 在 Ratpack 中,如何配置从外部文件加载配置?

c++ - 在 mongo 中存储大文件(但不是媒体)的正确方法?