我想在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,希望能够深入了解它。
答案 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示例正常工作仍然是一个谜。而且因为我之前没有提到这是主机文件的问题。