当前位置: 首页 > 知识库问答 >
问题:

通过使用SSL的Ruby驱动程序连接到Mongo会返回Mongo::Coneck tionFailure

益绯辞
2023-03-14

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

接下来,我按照官方文档中的描述设置了mon神。我确实按照他们的示例使用自我认证的密钥进行测试。配置的相关部分如下所示:

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

没事所以我觉得我已经把范围缩小到红宝石司机了

编辑我在同一台服务器上试用了他们的Python驱动程序,并使用了他们的示例程序

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

这确实连接得很好。所以至少我可以相当自信地认为mon神配置正确,问题出在Mongo Ruby驱动程序中的某个地方。很可能是他们当前驱动程序(v1.11.1)中的错误。

更新我还成功地通过ssl使用节点连接。js驱动程序:

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的问题跟踪器上打开了一个新问题,希望能弄清真相。

共有1个答案

鲜于光辉
2023-03-14

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

127.0.0.1   localhost.localdomain locahost

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

127.0.0.1   localhost.localdomain localhost

为什么Python示例工作正常仍然是个谜。正因为如此,我没有早点发现这是主机文件的问题。

 类似资料:
  • 我的java代码使用com.mongodb.DB的单个实例连接到mongo DB。现在我使用这个db实例跨越500个线程,这些线程对我的db执行命令。所有这些都并行运行。以下是conf参数: 现在,如果我使用“db.serverStatus().connections”检查我的数据库,我会得到以下结果:“current”:52,“available”:19999,“totalCreated”:Nu

  • 我正在尝试将mongo shell与我的mongo atlas M0集群连接,结果出现了这个错误 错误消息 我尝试的解决方案无效: 我将monog版本升级到4.2,以便与atlas中的mongo版本保持同步,但没有解决mongo出现此错误的问题 "mongodb://cluster0-shard-00-02.79t7i.azure.mongodb.net:27017,cluster0-shard-

  • 问题内容: 关于此问题的文章很多,但是似乎没人能解决,因此maby的某些情况已经改变。 我正在尝试将我的Android应用程序连接到位于mLab上的MongoDB服务器。我正在使用Mongo Java Drived,当然已经将该库添加到android studio中。 可以启动应用程序,但是当我单击注册按钮时,应用程序崩溃了。 这是我的代码: 我在清单文件中也有permision.INTERNET

  • 我有一个同时进行5次查询的应用程序,我可能需要在所有查询完成之前退出该应用程序,我想知道如何取消我的MongoClient正在进行的所有当前操作并关闭连接。 从我在stackoverflow中读到的另一个问题中,没有必要关闭或处置MongoClient中的连接,因为客户端会自动处理它,因此客户端会在应用程序退出时关闭连接,但客户端会等待这些查询完成后自动关闭还是会立即关闭?如果它等待,我如何让它取

  • 使用Morphia和mongo java驱动程序,我正在连接mongo服务器: 其中serverAddressList是主机:端口列表和使用kerberos身份验证的mongoCredential创建为: 我想使用以下参数设置自定义连接池参数: maxPoolSize 最小池大小 Maxidletimes等 为了实现这一点,我找到了ConnectionPoolSettings。建设者和com。mo

  • 我正在尝试使用js文件中的以下代码从我的机器上的meteor应用程序连接远程数据库: 将引发以下错误: 错误:EACCES,在object.future.wait处取消链接++os.linux.x86_64+web.browser+web.cordova/meteor-tool-os.linux.x86_64/tools/files.js:1124:24)在object.files.rm_recu