首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDb和nodejs /安全连接

MongoDb和nodejs /安全连接
EN

Stack Overflow用户
提问于 2015-01-23 09:41:37
回答 1查看 3K关注 0票数 0

如何通过ssl连接mongoDB和nodejs,

我使用这段代码来创建连接,但是它不起作用。

代码语言:javascript
复制
var Db = require('mongodb').Db;
var Server = require('mongodb').Server;
Db.connect('mongodb://xxx.xxx.xxx.xxx:27017/db-login', { auto_reconnect: true, poolSize:4, ssl:true }, function (err, db) {

我还尝试了另一种代码

代码语言:javascript
复制
 var localIP='xxx.xxx.xxx.xxx:27017', ssl=true;

任何帮助和建议

EN

回答 1

Stack Overflow用户

发布于 2015-11-25 20:47:05

步骤1:获取MongoDB 3.0

您需要知道的第一件事是,SSL只支持MongoDB 3.0及更高版本的开箱即用。在默认的存储库中,Ubuntu没有3.0,下面是您如何获得它的方法:

代码语言:javascript
复制
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org=3.0.7 mongodb-org-server=3.0.7 mongodb-org-shell=3.0.7 mongodb-org-mongos=3.0.7 mongodb-org-tools=3.0.7

3.0.7是目前最新的稳定版本,但可以用您最喜欢的版本代替3.0.7。

步骤2:获取私钥、证书和PEM文件

PEM包含公钥证书及其关联的私钥。这些文件可以用IRL美元从证书颁发机构获得,也可以使用OpenSSL生成,如下所示:

代码语言:javascript
复制
openssl req -newkey rsa:2048 -new -x509 -days 3650 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
cat mongodb-cert.key mongodb-cert.crt > mongodb.pem

mongodb.pem将用作PEM文件,mongodb-cert.key是专用密钥文件,mongodb-cert.crt是证书文件,也可以用作CA文件。这三个你都需要。

步骤3:配置MongoD

我们将假设您将这些文件复制到它们所属的/etc/ssl/文件夹中。现在我们打开我们的MongoDB配置文件:

代码语言:javascript
复制
sudo vi /etc/mongod.conf

并修改"#网络接口“部分如下:

代码语言:javascript
复制
# network interfaces
net:
  port: 27017
  #bindIp: 127.0.0.1
  ssl:
    mode: allowSSL
    PEMKeyFile: /etc/ssl/mongodb.pem
    #CAFile: /etc/ssl/mongodb-cert.crt

请注意:我们正在评论bindIp。这允许外部连接访问Mongo数据库。我们假设这是您的最终目标(您为什么要加密本地主机上的通信?),但是您应该在为您的MongoDB服务器设置授权规则之后才这样做。

CAFile也被注释掉,因为它是可选的。我将在这篇文章的末尾解释如何建立证书颁发机构信任。

与往常一样,在配置文件更改生效之前,您必须重新启动MongoDB:

代码语言:javascript
复制
sudo service mongod restart

你的服务器启动失败了吗?您是自己的,但是您的证书文件可能有问题。您可以通过手动运行mongod来检查启动错误:

代码语言:javascript
复制
sudo mongod --config /etc/mongod.conf

步骤4:测试服务器设置

在处理Node配置之前,让我们通过与mongo命令行客户端连接来确保服务器设置正常工作:

代码语言:javascript
复制
mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates

除非证书上的域名为127.0.0.1或localhost,否则必须使用-sslAllowInvalidHostname标志。如果没有它,您可能会得到以下错误:

代码语言:javascript
复制
E NETWORK  The server certificate does not match the host name 127.0.0.1
E QUERY    Error: socket exception [CONNECT_ERROR] for 
    at connect (src/mongo/shell/mongo.js:179:14)
    at (connect):1:6 at src/mongo/shell/mongo.js:179
exception: connect failed

第5步)配置Node.JS / Mongoose

如果在Node应用程序中使用节点-mongodb-本机包,请立即停止并开始使用Mongoose。没那么难。也就是说,mongoose.connect()实际上具有与mongodb.connect()相同的API,因此可以适当地替换。

代码语言:javascript
复制
    var fs = require('fs')
      , mongoose = require('mongoose')
      , mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
      , mongoOpt = {
          "server": { 
            "sslValidate": false,
            "sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
            "sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt')
          }
        }
      ;

mongoose.connect(mongoUri, mongoOpt);

步骤6)可选地通过证书颁发机构验证证书

为了验证SSL证书,您需要从证书颁发机构获得一个CA (或包)文件。这看起来很像您的证书文件,但通常包含多个证书(这些证书构成信任链以验证证书是否有效)。如果使用的是自签名证书,则可以使用mongodb-cert.crt作为CA文件。

您还需要确保您的MongoDB服务器的主机名与用于创建证书的主机名匹配。

步骤6.3)更新你的单神配置

代码语言:javascript
复制
sudo vi /etc/mongod.conf

并修改"#网络接口“部分如下:

代码语言:javascript
复制
# network interfaces net:   port: 27017   #bindIp: 127.0.0.1   ssl:
    mode: allowSSL
    PEMKeyFile: /etc/ssl/mongodb.pem
    CAFile: /etc/ssl/mongodb-ca.crt

sudo service mongod restart

步骤6.4)测试服务器设置

代码语言:javascript
复制
mongo --ssl --sslAllowInvalidHostnames --sslCAFile /etc/ssl/mongodb-ca.crt --sslPEMKeyFile /etc/ssl/mongodb.pem

Mongo客户端也可以传入CA文件,以验证他们是否正在与正确的服务器对话。这是使用-sslCAFile参数完成的。

使用CAFile配置的Mongo服务器要求客户端拥有服务器的有效证书和私钥。在mongo客户机中,这是通过传入--sslPEMKeyFile参数来完成的。

如果没有PEM文件(包含服务器的证书),您可能会看到以下错误:

代码语言:javascript
复制
I NETWORK  DBClientCursor::init call() failed
E QUERY    Error: DBClientBase::findN: transport error: 127.0.0.1:27017 ns: admin.$cmd query: { whatsmyuri: 1 }
    at connect (src/mongo/shell/mongo.js:179:14)
    at (connect):1:6 at src/mongo/shell/mongo.js:179
exception: connect failed

通过启用net.ssl.weakCertificateValidation,可以将服务器配置为接受来自没有PEM文件的客户端的请求,但是您将削弱安全性而没有真正的收益。

步骤6.5)配置Node.JS / Mongoose

这里有几个问题,所以请原谅我。

首先,您需要具有节点-mongodb-原生2.0或更高版本。如果您使用的是“猫鼬”,则需要“猫鼬4.0”或更高版本。以前的“猫鼬”版本使用节点-mongodb-本机1.*,它不支持任何身份的证书验证。

其次,在节点-mongodb本机中没有sslAllowInvalidHostnames或类似的选项可用。这不是Node -mongodb-本机开发人员可以修复的东西(我现在可能已经修复了),因为Node 0.10.*中的本地TLS库没有提供任何选项。在Node 4.*和5.*中,有一个提供希望的checkServerIdentity选项,但是在io.js合并之后从原始节点分支切换到分支可能会在当前造成一些麻烦。

所以让我们试试这个:

代码语言:javascript
复制
var fs = require('fs')
  , mongoose = require('mongoose')
  , mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
  , mongoOpt = {
      "server": { 
        "sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
        "sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt'),
        "sslCa": fs.readFileSync('/etc/ssl/mongodb-ca.crt')
      }
    }
  ;

如果您收到主机名/IP不匹配错误,可以修复证书,或者禁用sslValidate来否定所有这些困难工作:

代码语言:javascript
复制
var fs = require('fs')
  , mongoose = require('mongoose')
  , mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
  , mongoOpt = {
      "server": {
        "sslValidate": false,
        "sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
        "sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt'),
        "sslCa": fs.readFileSync('/etc/ssl/mongodb-ca.crt')
      }
    }
  ;

来源:http://www.bainweb.com/2015/11/connecting-to-mongodb-over-tlsssl-with.html

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28106940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档