You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)

解决方法:

  1. 验证证书与用户身份匹配
    X509认证的用户身份由证书Subject字段中的CN(通用名称)决定,格式为CN=<username>。需要确保MongoDB Cloud中创建的X509用户名称与证书的CN完全一致(包括大小写)。
    可通过以下命令查看证书的CN:

    openssl x509 -in rootCA.pem -text | grep "Subject:"
    
  2. 确认权限配置的有效性

    • 检查MongoDB Cloud的用户权限是否明确覆盖了目标数据库my-db及集合chats;
    • 确认权限是直接赋予该X509用户,而非通过角色继承时出现配置遗漏。
  3. 补全认证源配置
    X509认证必须使用$external作为认证源,确保连接字符串中包含authSource=%24external参数,或在Mongoose连接选项中显式指定authSource: "$external"。


内容的提问来源于stack exchange,提问作者Specyk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:41:42