1

我正在尝试将 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,这意味着我的初始设置没有错误。此外,它让我相信也必须有一种方法可以做到这一点。通过代码。

我的堆栈:

  • 节点JS:> 14.7
  • MongoDB:4.4
  • 操作系统:适用于开发的 macOS,产品将在 AmazonLinux2 上
  • 驱动程序:mongoose、native-nodejs、mongodb-client-encryption

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

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

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

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

4

1 回答 1

0

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

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

于 2021-09-27T03:38:18.593 回答