gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:23:32 24 4
gpt4 key购买 nike

如何使用 Node.js 通过 SSL 连接到 MongoDB 服务器?

我已经阅读了一些驱动程序的来源( mongojsmongodb-native )并且我已经搜索了一段时间,但似乎找不到任何合适的教程、指南或文档。

最佳答案

第一步:获取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 是 Private Key 文件,mongodb-cert.crt 是 Certificate 文件,也可以用作 CA 文件。您将需要所有这三个。
第 3 步:配置 MongoD
我们假设您已将这些文件复制到它们所属的/etc/ssl/文件夹中。现在我们打开我们的 MongoDB 配置文件:
sudo vi /etc/mongod.conf
并像这样修改“#网络接口(interface)”部分:
# 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.1localhost , --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-mongodb-native在 Node 应用程序中打包,立即停止并开始使用 Mongoose。这并不难。也就是说, mongoose.connect()具有与 mongodb.connect() 几乎相同的 API ,所以适当替换。
    var fs = require('fs')
, mongoose = require('mongoose')
, mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
, mongoOpt = {
"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
并像这样修改“#网络接口(interface)”部分:
# 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 文件的情况下接受来自客户端的请求。 ,但您将削弱您的安全性,而没有真正的 yield 。
步骤 6.5:配置 Node.JS/Mongoose
这里有几个问题,所以请耐心等待。
首先,您需要拥有 node-mongodb-native 2.0或以后。如果您使用的是 Mongoose ,那么您需要 Mongoose 4.0或以后。以前的 Mongoose 版本使用 node-mongodb-native 1.*它不支持任何身份的证书验证。
其次,没有 sslAllowInvalidHostnames或 node-mongodb-native 中可用的类似选项。这不是 node-mongodb-native开发人员可以修复(我现在已经有了),因为 Node 0.10.* 中可用的 native 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')
}
}
;

Source

关于javascript - 使用 Node.js 通过 SSL 连接到 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24381561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com