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

时间:2014-09-26 10:34:24

标签: ruby mongodb ssl mongodb-ruby

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

接下来,我按照官方docs中的说明设置了mongod。我确实遵循他们使用自我认证密钥进行测试的例子。配置的相关部分如下:

...
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)

没关系。所以我觉得我已经把它缩小到红宝石司机&amp; 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连接。因此,我在MongoDB的问题跟踪器上打开了new issue,希望能够深入了解它。

1 个答案:

答案 0 :(得分:0)

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

127.0.0.1   localhost.localdomain locahost

正如您所看到的,它错过了&#34; localhost&#34;中的第二个字母L. (我怀疑它在意外的vim手势中失踪了。)因此,为了解决我只需要恢复失踪的&#34; l&#34;:

127.0.0.1   localhost.localdomain localhost

为什么Python示例正常工作仍然是一个谜。而且因为我之前没有提到这是主机文件的问题。