【问题标题】:How do I set up mongoDB's new CSFLE feature, with explicit encryption implicit decryption using nodejs?如何设置 mongoDB 的新 CSFLE 功能,使用 nodejs 显式加密隐式解密?
【发布时间】:2021-09-03 19:06:37
【问题描述】:

我正在尝试将 MongoDB 的客户端归档级别加密功能与社区版一起使用。我对自动加密功能不感兴趣。但是,我们需要自动解密功能,根据文档,社区版也可以。

我们通常在我们的应用程序中使用猫鼬,但我也尝试使用本机 nodejs 驱动程序。这是我用来创建连接的代码。如果我注释掉 autoEncryption 对象,这可以正常工作。这样做可以让我手动加密,但这样我们也必须手动解密,这不符合目的。

一些文档建议将带有 extraOptions 对象的 bypassAutoEncryption: true 添加到 autoEncryption 对象。我已经做到了这一点,如下所示。

const secureClient = new MongoClient('mongodb://someUri', {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    autoEncryption: {
        keyVaultNamespace,
        kmsProviders,
        bypassAutoEncryption: true,
        extraOptions: {
            // mongocryptdBypassSpawn: true,
            mongocryptdSpawnArgs: [ "--pidfilepath=bypass-spawning-mongocryptd.pid", "--port", "27021"],
            mongocryptdURI: "mongodb://localhost:27021/db?serverSelectionTimeoutMS=1000"
        },
    }
});

我的代码一直在工作,直到生成主密钥、数据密钥并明确加密数据。不幸的是,我无法设置自动解密。要使用 CSFLE 选项配置客户端,必须在选项中传递 autoEncryption。 但是每当我通过此选项时,我都会收到以下异常

(node:53721) UnhandledPromiseRejectionWarning: MongoServerSelectionError: connect ECONNREFUSED 127.0.0.1:27021
    at Timeout._onTimeout (/Users/NiccsJ/ORI/code/testmongoEncryption/node_modules/mongodb/lib/sdam/topology.js:325:38)
    at listOnTimeout (internal/timers.js:554:17)
    at processTimers (internal/timers.js:497:7)
(Use `node --trace-warnings ...` to show where the warning was created)

我遵循了以下参考文献中的几乎所有建议。令人惊讶的是,mondodb-nodejs 文档甚至没有提到 bypassAutoEncryption。我只是偶然发现了 mongodb-c(下面的第 3 点和第 4 点)驱动程序文档,在那里我第一次找到了此类选项的 ant 参考

  1. https://github.com/mongodb/node-mongodb-native/blob/4ecaa37f72040ed8ace6eebc861b43ee9cb32a99/test/spec/client-side-encryption/tests/README.rst
  2. https://github.com/Automattic/mongoose/issues/8167
  3. http://mongocxx.org/mongocxx-v3/client-side-encryption/
  4. https://mongodb.github.io/mongo-csharp-driver/2.11/reference/driver/crud/client_side_encryption/#explicit-encryption-and-auto-decryption

我能够使用自动解密配置 mongoShell,这意味着我的初始设置没有问题。此外,它让我相信必须有一种方法可以做到这一点。通过代码。

我的堆栈:

  • nodeJS:> 14.7
  • mongoDB:4.4
  • 操作系统:macOS for dev,prod 将在 AmazonLinux2 上
  • 驱动程序:猫鼬,native-nodejs,mongodb-client-encryption

文档中没有明确提及。但据我了解,自动解密不需要企业专用的 mongocryptd 进程。

正如官方mongoDB-c-driver所提到的

虽然自动加密需要 MongoDB 4.2 企业版或 MongoDB 4.2 Atlas 集群,但所有用户都支持自动解密。要配置不自动加密的自动解密,请在 options::auto_encryption 类中设置 bypass_auto_encryption=True。

我相信 bypassAutoEncryption 选项就是为此目的而设计的。

【问题讨论】:

  • ECONNREFUSED 表示操作系统主动拒绝了连接,因为该端口上没有任何监听。你有没有安装任何东西来听那个mongocryptdURI
  • @Joe 不,该 URI 上实际上没有运行任何内容。我读了一些tests 建议必须明确传递其中一些选项以跳过生成 mongocryptd 进程。我真的不需要这些选项,我只是希望 bypassAutoEncryption 以某种方式工作。
  • 如果我没看错文档,自动加密或解密需要本地 mongodcryptd 进程,该进程仅在付费企业版中提供。
  • @Joe 实际上在文档中有点混乱。但是只有自动加密需要 mongocryptd 进程。我对我的帖子进行了一些编辑。请检查

标签: node.js mongodb mongoose encryption mongodb-csfle


【解决方案1】:

不完全是答案,但这是目前最好的解决方案。 我将此作为官方 JIRA 上的错误报告。

事实证明,这显然是带有 node-mongo-native 库的bug。 根据他们的评论,这应该在下一个版本中修复。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2016-01-12
    • 2021-10-10
    • 1970-01-01
    • 2022-08-20
    • 2023-01-14
    • 2015-03-12
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多