我想在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,希望能够达到此目的。