Node.js 无法确定Mongoose到DocumentDB的SSL连接错误
我在AWS Elastic Beanstalk(EB)中有两个环境,运行Node.js应用程序,利用Mongoose框架连接到DocumentDB。其中一个环境莫名其妙地停止工作,而另一个环境工作正常。两者都是从CI/CD生成服务器部署的,该服务器利用EB CLI部署应用程序代码 有问题的环境在nodejs.log中生成以下错误:Node.js 无法确定Mongoose到DocumentDB的SSL连接错误,node.js,mongoose,amazon-elastic-beanstalk,aws-documentdb,aws-documentdb-mongoapi,Node.js,Mongoose,Amazon Elastic Beanstalk,Aws Documentdb,Aws Documentdb Mongoapi,我在AWS Elastic Beanstalk(EB)中有两个环境,运行Node.js应用程序,利用Mongoose框架连接到DocumentDB。其中一个环境莫名其妙地停止工作,而另一个环境工作正常。两者都是从CI/CD生成服务器部署的,该服务器利用EB CLI部署应用程序代码 有问题的环境在nodejs.log中生成以下错误: name: 'MongooseTimeoutError', reason: { Error: unable to get local issuer ce
name: 'MongooseTimeoutError',
reason:
{ Error: unable to get local issuer certificate
at TLSSocket.onConnectSecure (_tls_wrap.js:1058:34)
at TLSSocket.emit (events.js:198:13)
at TLSSocket._finishInit (_tls_wrap.js:636:8)
name: 'MongoNetworkError',
[Symbol(mongoErrorContextSymbol)]: {} },
[Symbol(mongoErrorContextSymbol)]: {} }
两者在连接到同一实例时使用相同的连接字符串mongodb://******:*****@docdb-2019-08-***-***-***-***-***-***.cluster-*****.us-east-2.docdb.amazonaws.com:27017/db_name?ssl=true&ssl_-ca_-certs=/etc/ssl/certs/rds组合ca bundle.pem&replicaSet=rs0
证书pem文件与两者使用的文件相同,并通过EB.ebextensions脚本部署到实例
我尝试过的事情:
- 连接到问题环境的EC2实例,安装了mongodb外壳,并能够使用Mongo connect字符串中指定的证书成功连接到DocumentDB实例
- 通过Elastic Beanstalk web管理控制台重建了EB环境
当时有点固执己见。也有同样的问题。。不确定这是否会随着2019年证书的变更而中断。。无论如何,我必须通过代码更改(将sslCA参数添加到下面的Mongoose connect方法中)和从连接字符串中删除ssl证书位置来解决这个问题
connect(uri, {useNewUrlParser: true,
useFindAndModify: false,
sslCA: [fs.readFileSync("rds-combined-ca-bundle.pem")]}, (err: any)
Amazon的DocumentDB of icial documentation有一个示例代码,可以正常工作,不会触发此错误 这是Node.JS示例,为了清晰起见,进行了一些修改:
const { MongoClient } = require('mongodb');
const fs = require('fs');
const caContent = [fs.readFileSync("/path/to/rds-combined-ca-bundle.pem")];
const options = {
sslValidate: true,
sslCA: caContent,
useNewUrlParser: true
};
const connUri = 'mongodb://user:pass@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/sample-database?ssl=true&replicaSet=rs0&readPreference=secondaryPreferred';
const client = new MongoClient(connUri, options);
const client = await MongoClient.connect();
是的。。这是一种方法;)。。无论如何,我是来自AWS论坛响应的同一用户。我想我也会把它贴在这里。