繁体   English   中英

MongoDb和Node.js SSl /安全连接

[英]MongoDb and nodejs SSl/Secure Connection

我如何通过SSL连接mongoDB和nodejs,
我正在使用此代码创建连接,但无法正常工作

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) {

我也尝试了另一个代码

 var localIP='xxx.xxx.xxx.xxx:27017', ssl=true;

任何帮助和建议

步骤1:获取MongoDB 3.0

您需要知道的第一件事是,MongoDB 3.0及更高版本仅支持现成的SSL。 Ubuntu在默认存储库中没有3.0,因此您可以通过以下方式获得它:

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生成,如下所示:

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配置文件:

sudo vi /etc/mongod.conf

并修改“#网络接口”部分,如下所示:

# 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数据库。 我们假设这是您的最终目标(为什么要在localhost上加密通信?),但是仅应在为MongoDB服务器设置授权规则之后执行此操作。

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

与往常一样,您必须重新启动MongoDB才能使配置文件更改生效:

sudo service mongod restart

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

sudo mongod --config /etc/mongod.conf

步骤4:测试您的服务器设置

在弄乱Node配置之前,让我们通过连接mongo命令行客户端来确保服务器设置正常运行:

mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates

除非证书上的域名是127.0.0.1或localhost,否则必须使用--sslAllowInvalidHostnames标志。 没有它,您可能会收到此错误:

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 /猫鼬

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

    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)更新您的mongod配置

sudo vi /etc/mongod.conf

并修改“#网络接口”部分,如下所示:

# 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)测试您的服务器设置

mongo --ssl --sslAllowInvalidHostnames --sslCAFile /etc/ssl/mongodb-ca.crt --sslPEMKeyFile /etc/ssl/mongodb.pem

Mongo客户端也可以传入CA文件,以验证它们是否与正确的服务器通信。 这是通过--sslCAFile参数完成的

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

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

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 /猫鼬

这里有一些陷阱,请多多包涵。

首先,您需要使用node-mongodb-native 2.0或更高版本。 如果您使用的是Mongoose,则需要Mongoose 4.0或更高版本。 以前的Mongoose版本使用node-mongodb-native 1. *,它不支持任何容量的证书验证。

其次,node-mongodb-native中没有sslAllowInvalidHostnames或类似选项。 这不是node-mongodb-native开发人员可以解决的(我现在应该解决),因为Node 0.10。*中可用的本机TLS库对此不提供任何选择。 在Node 4. *和5. *中,有一个checkServerIdentity选项可以带来希望,但是在io.js合并后从原始Node分支切换到该分支可能会在当前造成一些麻烦。

因此,让我们尝试一下:

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取消所有这些艰苦的工作:

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

使用以下链接在您的mongoDB环境中配置SSL。

必须在您的MongoDB环境中启用SSL,并且必须在您的应用程序中启用SSL。

http://docs.mongodb.org/manual/tutorial/configure-ssl/ http://docs.mongodb.org/manual/tutorial/configure-ssl-clients/

您可以按照以下步骤在节点中配置SSL连接:

var options = {
    key: fs.readFileSync('ssl/your_ssl_key.key'),
    cert: fs.readFileSync('ssl/your_ssl_cert.cert')
};

https.createServer(options, app).listen(443);

如果要对所有用户强制使用https连接,则可以强制重定向:

    require("http").createServer(function (req, res) {
    res.writeHead(301, {
        'Content-Type': 'text/plain',
        'Location': 'https://' + req.headers.host + req.url
    });
    res.end('Redirecting to SSL\n');
}).listen(80);

https.createServer(options, app).listen(443);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM