MongoDb 和 Nodejs SSL/安全连接

2024-04-07

我如何通过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 数据库。我们假设这是您的最终目标(为什么要加密本地主机上的流量?),但您应该只在为 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 / Mongoose

如果您在 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 / Mongoose

这里有一些问题,所以请耐心等待。

首先,您需要有 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 选项带来了希望,但从原始 Node 分支切换到 io.js 合并后的分支目前可能会引起一些头痛。

那么让我们试试这个:

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')
      }
    }
  ;

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDb 和 Nodejs SSL/安全连接 的相关文章

随机推荐

  • GKE 集群的一个节点无法从 dockerhub 拉取镜像

    这是一件很苦涩的事情 我创建了一个private具有 3 个节点的节点池的 GKE 集群 然后我有一个包含 3 个 Pod 的副本集 其中一些 pod 将被调度到一个节点 所以这些豆荚之一总是得到ImagePullBackOff 我检查错误
  • tinyMCE 获取编辑器返回 null

    我在具有不同 id 的 2 个文本区域上初始化 2 个 tinyMCE 编辑器 var variable array id cName test mon test tinymce init selector model editor ent
  • 多个 cURL 操作,同一会话

    首先 我知道curl multi init 但据我所知 它并不能完全满足我的需要 我在登录后下载文件 所以 a 需要登录 b 下载图像 这是我目前拥有的 login url https us test com Member Login ch
  • 计算列中除 n 个指定范围之外的所有字段

    我正在尝试计算整列中除 n 指定范围之外的所有字段 我需要选择整个列以满足将来的扩展 目前我正在尝试 COUNTIF B B lt gt ASY999 OR lt gt ASY002 OR lt gt CIB001 OR lt gt 但公式
  • 我应该将跨域 XML 放在 Tomcat 中的什么位置?

    我有一个跨域策略文件 希望添加到我拥有的 Tomcat 服务器中 如果tomcat是localhost 8080并且安装在 usr local tomcat 我应该放置此策略文件的根文件夹在哪里 将您的跨域策略放入ROOT webapp f
  • 关于重定向应该如何工作的问题

    所以我有一个网络应用程序 我正在使用一个表单 该表单要求在提交之前填充所有字段 如果您尝试在未填充字段的情况下提交应用程序 它会再次加载带有错误的页面 填写完所有字段并单击 提交 后 它会重定向到同一页面并显示一条从 flashdata 生
  • Git 获取标记文件而不克隆

    关于这些 URL git perl5 git perl org perl git http perl5 git perl org perl git tags 比如说 我如何从 perl 5 10 0 获取 MANIFEST 目前无法从 Gi
  • Python使用正则表达式提取twitter文本数据中的@user和url链接

    有一个列表字符串twitter文本数据 例如下面的数据 实际上有大量文本 不仅仅是这些数据 我想提取twitter文本中 后面的所有用户名和url链接 例如 galaxy5univ 和 url 链接 tweet text galaxy5un
  • 什么是记录匿名用户投票且不允许重复的可靠方法

    首先 我尽我所能进行搜索并阅读所有看起来相关的问题 但没有具体回答这个问题 这不是重复的 afaik 显然 如果允许在网站上进行匿名投票 则没有万无一失的方法可以阻止某人多次投票 然而 我想知道是否有经验的人可以帮助我想出一种相当可靠的方法
  • 在 MongoDB 中使用 $and 的多个 $regex

    我收集了一些以下记录 id ObjectId 52b18fb2a21351b2bb29dfc7 title aaa id ObjectId 52b18fd0d17d7f69e078f7b7 title bbb id ObjectId 52b
  • 单词是否在字典中

    我想看看字典里是否有一个单词 有什么办法可以做到这一点吗 获取 假设的 英语单词列表并将其放入数据库 可能是 Sqlite 以实现可移植性 您可以在此处获取单词列表 http wordlist sourceforge net http wo
  • 加入 MP3 文件 - 将 Java 代码转换为 Android

    我正在尝试制作一个程序 可以合并 2 个 MP3 文件并将它们保存在 android SD 卡上 我有可以运行的 Java 代码 但是当我尝试将其转换为 Android 时 出现了一些错误 下面用Java代码编写 它运行完美 import
  • 如何解决“DL已弃用,请使用Fiddle”Rails 4.1.8?

    我在 Rails 包上安装 ruby 并检查版本 当我检查 Rails 版本时 它显示 DL 已弃用 请使用 Fiddle 如何解决 DL 已弃用 请使用 Fiddle 我使用的是 Windows 8 1 谢谢之前 由于 Ruby 2 0
  • 为什么 RedirectToRoute("Default") 不重定向到根目录?

    鉴于这些路线 routes MapRoute Test test new controller Test action Index routes MapRoute Default controller action id new contr
  • git push = 时出错! [远程拒绝] master -> master(预接收挂钩被拒绝)

    我认为 这是一个与此不同的问题 远程拒绝主控 gt 主控 预接收挂钩拒绝 https stackoverflow com questions 9542665 remote rejected master master pre receive
  • Knit 在 R 代码中转义乳胶特殊字符(例如 ~、$)

    当我在这个knitr文档的输出上运行它时 LaTeX崩溃了 因为LaTeX特殊字符没有正确转义 有任何提示如何解决这个问题吗 documentclass beamer begin document begin frame Unescaped
  • 更改 MVC3 索引视图中的顺序

    想要有可点击的列标题 例如点击 TagCode 一次 它会按该顺序排序 然后再次反转 号码也一样 使用 MVC3 Razor 和 LightSpeed ORM 我知道网格例如http mvccontrib codeplex com http
  • Bootstrap 3 Datepicker v4 - 设置默认日期

    我正在使用这个日期时间选择器http eonasdan github io bootstrap datetimepicker http eonasdan github io bootstrap datetimepicker 在我的编辑表格中
  • 运行时无命令输出:'am start -n Error

    当我在 Eclipse 中运行应用程序并单击按钮启动新活动时 我的应用程序强制关闭 并收到此错误 null Error Sat Apr 23 19 53 21 CDT 2011 No command output when running
  • MongoDb 和 Nodejs SSL/安全连接

    我如何通过ssl连接mongoDB和nodejs 我正在使用此代码来创建连接 但它不起作用 var Db require mongodb Db var Server require mongodb Server Db connect mon