我正在尝试将 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 参考
- https://github.com/mongodb/node-mongodb-native/blob/4ecaa37f72040ed8ace6eebc861b43ee9cb32a99/test/spec/client-side-encryption/tests/README.rst
- https://github.com/Automattic/mongoose/issues/8167
- http://mongocxx.org/mongocxx-v3/client-side-encryption/
- 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 4.2 企业版或 MongoDB 4.2 Atlas 集群,但所有用户都支持自动解密。要配置不自动加密的自动解密,请在 options::auto_encryption 类中设置 bypass_auto_encryption=True。
我相信bypassAutoEncryption选项就是为此目的而设计的。