javascript – 使用Node.js通过SSL连接到MongoDB

栏目: Node.js · 发布时间: 5年前

内容简介:翻译自:https://stackoverflow.com/questions/24381561/connecting-to-mongodb-over-ssl-with-node-js
如何使用Node.js通过SSL连接到 MongoDB 服务器?

我已经阅读了几个驱动程序的来源( mongojs , mongodb-native ),我现在一直在谷歌搜索,但似乎找不到任何适当的教程,指南或文档.

第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包含公钥证书及其关联的私钥.这些文件既可以从证书Authroity获得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”部分,如下所示:

# 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 / 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”部分,如下所示:

# 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选项提供了希望,但是在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')
      }
    }
  ;

翻译自:https://stackoverflow.com/questions/24381561/connecting-to-mongodb-over-ssl-with-node-js


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入浅出Ajax

深入浅出Ajax

(美)Brett McLaughlin / 东南大学出版社 / 2006-5 / 98.00元

本书将教会您如何在很短的时间内掌握使用JavaScript代码来向服务器提交异步请求?同时,您可以学习如何使用诸如动态HTML、XML、JSON、DOM等技术来解决开发过程中遇到的许多问题。让你从那些繁琐而笨拙的网站开发技术中彻底解放出来!本书将是一本指导您进行异步开发的经典参考书籍。   作为一名网站设计人员,您也许时常因为遇到以下情况而烦恼:用户只是移动了鼠标就要从服务器重载数据......一起来看看 《深入浅出Ajax》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具