ruby - 使用 SSL 通过 Ruby 驱动程序连接到 Mongod 返回 Mongo::ConnectionFailure

标签 ruby mongodb ssl mongodb-ruby

我想在 MongoDB 中使用 SSL。默认情况下未启用它,因此必须使用必要的选项从源代码进行编译。我关注了official documentation并在运行 Ubuntu 14.04 的新部署服务器上构建并运行良好的 v2.6.4 二进制文件。到目前为止一切都很好。

接下来我按照官方docs中的描述设置mongod .我确实遵循了他们使用自认证 key 进行测试的示例。配置的相关部分如下所示:

...
net:
   bindIp: 127.0.0.1
   port: 27017
   ssl:
      mode: requireSSL
      PEMKeyFile: /opt/mongo/security/mongodb.pem
...

如果我随后运行客户端并指定使用 SSL,我可以正常连接。 ($ mongo --ssl)。 FWIW,如果我尝试不使用 --ssl 参数,则它不会连接。

好的,是时候通过 Ruby 进行链接了。我在同一台服务器上,我尝试使用以下 ruby​​ 脚本:

require 'rubygems'
require 'mongo'

client = Mongo::MongoClient.new('localhost', 27017, {:ssl => true})

没有。它没有:

/home/test/.rvm/gems/ruby-1.9.3-p547/gems/mongo-1.11.1/lib/mongo/mongo_client.rb:422:in `connect': Failed to connect to a master node at localhost:27017 (Mongo::ConnectionFailure)
from /home/test/.rvm/gems/ruby-1.9.3-p547/gems/mongo-1.11.1/lib/mongo/mongo_client.rb:661:in `setup'
from /home/test/.rvm/gems/ruby-1.9.3-p547/gems/mongo-1.11.1/lib/mongo/mongo_client.rb:177:in `initialize'
from test_mongo_ssl.rb:8:in `new'
from test_mongo_ssl.rb:8:in `<main>'

所以最好确保没有 SSL 的默认连接没有问题。我在 mongod 上禁用 SSL 并重新启动。然后再次尝试 ruby​​ 脚本,这次没有 ssl 选项:

...
client = Mongo::MongoClient.new('localhost', 27017)

而且还不错。因此,我觉得我已经将范围缩小到 ruby​​ 驱动程序和 ssl,但除此之外,没有什么可以继续的了。

编辑 我在同一台服务器上尝试了他们的 Python 驱动程序并使用了他们的 example program :

from pymongo import MongoClient
c = MongoClient(host="localhost", port=27017, ssl=True)

这确实连接正常。所以至少我可以相当确信 mongod 配置正确并且问题出在 Mongo Ruby 驱动程序中的某个地方。很可能是他们当前的驱动程序 (v1.11.1) 中的错误。

更新 我也使用 node.js 驱动程序通过 ssl 成功连接:

var mongo = require('mongodb');
var database = new mongo.Db("my_database", new mongo.Server("127.0.0.1", 27017, {ssl:true} ), {w:0});
database.open(function(err, db) {
    if(err) throw err;
    db.authenticate('user', 'password', function(err, result) {
      var collection = db.collection('foo');
      collection.findOne(function(err, item) {
      if(err) throw err;
        console.log(item);
        db.close();
      });
    });
});

似乎越来越有可能是 ruby​​ 驱动程序中存在错误,或者文档不完整并且没有准确解释如何使用 SSL 连接。因此我打开了一个 new issue在 MongoDB 的问题跟踪器上,希望能弄清这个问题的真相。

最佳答案

令人尴尬的是,这个问题的解决方案是我的/etc/hosts 文件中有一个 localhost 条目的拼写错误:

127.0.0.1   localhost.localdomain locahost

如您所见,它缺少“localhost”中的第二个字母 L。 (我怀疑它在一个意外的 vim 手势中丢失了。)因此为了解决我只需要恢复丢失的“l”:

127.0.0.1   localhost.localdomain localhost

Python 样本为何能正常工作仍然是个谜。正因为如此,我之前没有意识到这是主机文件的问题。

关于ruby - 使用 SSL 通过 Ruby 驱动程序连接到 Mongod 返回 Mongo::ConnectionFailure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26057561/

相关文章:

ruby 正则表达式解析

ruby-on-rails - Rails Date.today 反射(reflect)了服务器部署日期

ruby - 为 App Store Connect API 生成 token

c# - DeleteManyAsync 会在删除文档时锁定 MongoDB 集合吗?

javascript - 如何使用带有严格 : false schema? 的 mongoose 将字段添加到 mongoDB 文档中

ruby - 如何在 heroku 上运行简单的 ruby​​ 脚本(不是 RoR 应用程序)?

node.js - 使用 Mongoose 在 MongoDB 中创建关系(在 Node.js 中)

linux - 我的服务器已关闭,可以 ping/SSH 但不能使用 Https

ruby-on-rails - ruby rails : ssl_required: how do I enable on the entire app?

Django:对从子域提供的静态内容使用 SSL (https) 方案