我正在尝试使用配置了 SSL 连接的 Mongoose 从 NodeJS 程序连接 mongod 实例,但我在 mongod 控制台上收到以下错误:“从客户端接收请求时出错:SSLHandshakeFailed:服务器配置为仅允许 SSL 连接.”
mongod实例启动如下:
mongod --sslMode requireSSL --sslPEMKeyFile C:/Users/MyUsername/Path/mongodb.pem
我尝试使用 MongoClient 而不是 mongoose,但没有发生任何新情况。 这是我的一段代码:
if(envConfig.config.db.tls === true){
let certFile = [fs.readFileSync("C:/PATH/TO/Key/mongoDB.pem")];
mongoose.connect("mongodb://localhost:27017/DB_NAME?ssl=true",{
server:{
sslValidate: true,
sslCA: certFile
}
});
}else{
mongoose.connect(`mongodb://${dbUrl}`,options);
}
这与 PEM 文件无关,因为当我按照我编写的方式启动 mongod 并使用代码中相同的 PEM 文件与 MongoDB Compass 进行 SSL 连接时 - 它可以工作。
MongoDB 版本:3.6.0
猫鼬版本:4.13.6
如果有人能指导我我做错了什么,我会很高兴。
如果您使用私钥和证书启动 MongoDB 守护进程
mongod --sslMode requireSSL --sslPEMKeyFile C:/Users/MyUsername/Path/mongodb.pem --sslCAFile C:/Users/MyUsername/Path/mongodb.crt
您可以像这样从 Node JS 连接
if(envConfig.config.db.tls === true){
let key = fs.readFileSync("C:/Users/MyUsername/Path/mongodb.pem");
let crt = fs.readFileSync("C:/Users/MyUsername/Path/mongodb.crt");
mongoose.connect("mongodb://localhost:27017/DB_NAME?ssl=true",{
server:{
"sslValidate" :true
"sslKey": key,
"sslCert": crt, // if you have one certificate you can use `sslCert` parameter
}
});
}else{
mongoose.connect(`mongodb://${dbUrl}`,options);
}
通过 Node JS 进行 SSL 连接的更多详细说明,您可以前往这里
解决了! 问题是使用快速会话中间件并尝试使用不正确的连接字符串连接数据库,这就是导致问题的原因。
我使用 [email protected]从 Node.JS 连接时遇到类似的错误:
MongoServerSelectionError:A0230000:错误:0A000438:SSL 例程:ssl3_read_bytes:tlsv1 警报内部 错误:c:\ws\deps\openssl\openssl\ssl 埃科德 ec_layer_s3.c:1605:SSL 警报号码 80
错误:MongoNetworkError:A0230000:错误:0A000438:SSL 例程:ssl3_read_bytes:tlsv1 警报内部 错误:c:\ws\deps\openssl\openssl\ssl 埃科德 ec_layer_s3.c:1605:SSL 警报号码 80
当我降级到 [电子邮件受保护] 时效果很好。
我的配置有些不喜欢 - SSL3 TLSV1 不工作或其他什么。