如何构建可连接EC2上MongoDB 3.3.4的mongodb://连接字符串?
问题描述
我在EC2上运行较旧版本的MongoDB(3.3.4),已启用带自签名证书的TLS/SSL,且能通过Mongo主机上的mongo命令行成功连接,命令如下:
mongo --ssl --username "<xxxx>" --password "<xxxxx>" --sslAllowInvalidCertificates --host <host>.us-east-1.compute.amazonaws.com:27017 --sslPEMKeyFile /etc/ssl/mongodb.pem --authenticationDatabase admin
尝试转换为mongodb://连接字符串时,使用以下写法出现连接错误:
mongo "mongodb://<user>:<password>@<host>.us-east-1.compute.amazonaws.com:27017/?ssl=true&sslPEMKeyFile=/etc/ssl/mongodb.pem&sslAllowInvalidCertificates=true&authenticationDatabase=admin"
错误信息:
2023-12-18T16:47:18.479+0000 I NETWORK [thread1] Socket recv() Connection reset by peer 172.31.1.1:27017 2023-12-18T16:47:18.479+0000 I NETWORK [thread1] SocketException: remote: (NONE):0 error: SocketException socket exception [RECV_ERROR] server [x.x.x.x:27017] 2023-12-18T16:47:18.479+0000 E QUERY [thread1] Error: network error while attempting to run command 'isMaster' on host 'ec2-12-192-131-211.us-east-1.compute.amazonaws.com:27017' : connect@src/mongo/shell/mongo.js:251:13 @(connect):1:6 exception: connect failed
本地MongoDB Compass通过UI生成的连接字符串可以成功连接:
mongodb://<user>:<password>@<host>.us-east-2.compute.amazonaws.com:27017/?tls=true&tlsCAFile=/etc/ssl/mongodb.pem
但在Mongo主机上使用该字符串同样出现上述连接错误。
请问如何编写可成功连接该数据库的mongodb://连接字符串?
解决方案
针对MongoDB 3.3.4这类旧版本,连接字符串的参数支持有限,部分TLS相关参数无法直接通过连接字符串传递,以下是两种可行的解决方式:
方式1:连接字符串+命令行参数
将认证信息、地址、基础SSL参数放到连接字符串中,而sslPEMKeyFile和sslAllowInvalidCertificates仍保留为命令行参数,组合使用:
mongo "mongodb://<user>:<password>@<host>.us-east-1.compute.amazonaws.com:27017/?ssl=true&authenticationDatabase=admin" --sslAllowInvalidCertificates --sslPEMKeyFile /etc/ssl/mongodb.pem
方式2:配置文件+连接字符串
创建一个MongoDB客户端配置文件(比如~/mongo_client_config.js),写入以下配置:
var mongodbConfig = { ssl: true, sslAllowInvalidCertificates: true, sslPEMKeyFile: "/etc/ssl/mongodb.pem", authenticationDatabase: "admin" };
然后连接时指定配置文件和精简的连接字符串:
mongo "mongodb://<user>:<password>@<host>.us-east-1.compute.amazonaws.com:27017" --config ~/mongo_client_config.js
关键注意点
- MongoDB 3.x版本不支持将
sslPEMKeyFile、sslAllowInvalidCertificates这类TLS参数放到连接字符串的查询参数中,必须通过命令行或配置文件传递。 - Compass使用的是
tls前缀的参数(如tlsCAFile),但MongoDB 3.3.4仍使用ssl前缀参数,两者不兼容,这是直接用Compass生成的字符串失败的核心原因。 - 连接字符串中仅能包含
ssl=true、authenticationDatabase=admin这类通用参数,其他敏感或版本专属参数需用传统方式配置。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

