我想在 MongoDB 中使用 SSL。默认情况下未启用它,因此必须使用必要的选项从源代码编译。我按照官方 文档进行了构建,并在新部署的运行 Ubuntu 14.04 的服务器上构建并运行良好的 v2.6.4 二进制文件。到目前为止一切都很好。
接下来我按照官方文档中的描述设置 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)
没关系。因此,我觉得我已将其范围缩小到 ruby 驱动程序和 ssl,但除此之外,几乎没有其他可做的了。
编辑我在同一台服务器上尝试了他们的 Python 驱动程序并使用了他们的示例程序:
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 的问题跟踪器上打开了一个新问题,希望能够深入了解这一点。