2014-09-26 61 views
0

我想在MongoDB中使用SSL。它没有默认启用,所以必须从源代码编译必要的选项。我遵循officialdocumentation并获得了v2.6.4二进制文件,并在运行Ubuntu 14.04的全新部署的服务器上很好地运行。迄今为止都很好。使用SSL通过Ruby驱动程序连接到Mongod返回Mongo :: ConnectionFailure

接下来,我设置了官方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进行连接。我在同一台服务器上,并尝试使用以下红宝石脚本:

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并重新启动。然后再次尝试红宝石脚本,这次没有ssl选项:

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

这很好。因此,我觉得我已经缩小到了红宝石驱动程序& ssl,但除此之外,没有什么可以继续。

编辑我试图在同一服务器上的Python的驱动程序和使用他们的example program

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

,但这并连接好。所以至少我可以相当确信mongod配置正确,问题在于Mongo Ruby驱动程序中的某处。很可能是他们当前驱动程序中的一个错误(v1.11.1)。

UPDATE我也有成功使用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,希望能够达到此目的。

回答

0

而是令人尴尬的,解决这个问题是我的/ etc/hosts文件曾经为localhost条目一个错字:

127.0.0.1 localhost.localdomain locahost 

正如你所看到的,它缺少的第二个字母L的“本地主机”。 (我怀疑它去一个偶然的vim的手势期间失踪。)因此,为了解决我不得不恢复丢失的“L”:

127.0.0.1 localhost.localdomain localhost 

它仍然是一个谜,为什么Python示例工作正常。这是因为我之前没有弄明白这是hosts文件的问题。

相关问题