使用Mongoose通过证书连接MongoDB Atlas云遇证书及权限问题求助
MongoDB Cloud X509认证:Mongoose连接问题排查与解决
问题1:连接时抛出unable to get local issuer certificate错误
已通过mongosh或MongoDB Compass成功连接MongoDB Cloud,使用的命令如下:
mongosh "mongodb+srv://somewhere.d3m3rrv.mongodb.net/macau-game?authSource=%24external&authMechanism=MONGODB-X509" --apiVersion 1 --tls --tlsCertificateKeyFile rootCA.pem
但使用Mongoose连接时执行以下代码报错:
mongoose.connect(config.db.mongoUri, { tls: true, authMechanism: 'MONGODB-X509', authSource: "$external", tlsCAFile: `rootCA.pem` }); logger.info("Trying to connect to database " + config.db.mongoUri) mongoose.connection .once("open", () => { logger.info("MongoDB Connection success"); }) .on("error", (error) => { logger.error("MongoDB Connection to " + config.db.mongoUri + "failed"); })
错误信息:
MongooseServerSelectionError: unable to get local issuer certificate at Connection.openUri (/root/app/dist/node_modules/mongoose/lib/connection.js:807:32)
解决方法:
mongosh使用的tlsCertificateKeyFile是同时包含客户端证书和私钥的文件,而初始Mongoose配置仅指定了CA证书文件tlsCAFile,缺少客户端证书与密钥的配置。调整连接选项如下:
const fs = require('fs'); // 读取包含客户端证书和私钥的PEM文件 const credentials = fs.readFileSync('rootCA.pem'); mongoose.connect(config.db.mongoUri, { ssl: true, authMechanism: 'MONGODB-X509', authSource: "$external", sslCert: credentials, sslKey: credentials, // 若CA证书与客户端证书分离,需额外添加:sslCA: fs.readFileSync('ca-cert.pem') });
问题2:连接成功但查询时抛出user is not allowed to do action [find] on [my-db.chats]
调整Mongoose配置后连接成功,但查询数据时报错,且MongoDB Cloud中该证书对应的用户已配置读写所有数据库权限。当前代码:
mongoose.connect(config.db.mongoUri, { ssl: true, sslCert: credentials, sslKey: credentials, });
错误信息:
MongoServerError: user is not allowed to do action [find] on [my-db.chats] at Connection.onMessage (/Users/me/Projects/my-project/node_modules/mongodb/src/cmap/connection.ts:450:20)
解决方法:
验证证书与用户身份匹配
X509认证的用户身份由证书Subject字段中的CN(通用名称)决定,格式为CN=<username>。需要确保MongoDB Cloud中创建的X509用户名称与证书的CN完全一致(包括大小写)。
可通过以下命令查看证书的CN:openssl x509 -in rootCA.pem -text | grep "Subject:"确认权限配置的有效性
- 检查MongoDB Cloud的用户权限是否明确覆盖了目标数据库
my-db及集合chats; - 确认权限是直接赋予该X509用户,而非通过角色继承时出现配置遗漏。
- 检查MongoDB Cloud的用户权限是否明确覆盖了目标数据库
补全认证源配置
X509认证必须使用$external作为认证源,确保连接字符串中包含authSource=%24external参数,或在Mongoose连接选项中显式指定authSource: "$external"。
内容的提问来源于stack exchange,提问作者Specyk
相关产品推荐
相关产品推荐

