我试图在社区版中使用MongoDB的客户端文件级加密功能。我对自动加密功能不感兴趣。然而,我们需要自动解密功能,这是根据文档是可能的,在社区版。
我们通常在应用程序中使用mongoose,但我也尝试过使用本机nodejs驱动程序。下面是我用来创建连接的代码。如果我注释掉autoEncryption对象,这就很好了。这样做可以让我手动加密,但这样的话,我们也必须手动解密,哪种方式比目的更好。
一些文档建议在autoEncryption对象中添加bypassAutoEncryption: true with extraOptions对象。我看过了,下面也看到了。
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引用。
我能够用自动解密配置mongoShell,这意味着我的初始设置不是错误的。而且,这也让我相信,必须有一种方法来实现.via代码。
我的堆栈:
在文档中没有明确提到这一点。但据我所知,自动解密并不需要企业专用的mongocryptd进程。
正如官方mongoDB-c-驱动器中所提到的
虽然自动加密需要MongoDB 4.2企业或MongoDB 4.2 Atlas集群,但所有用户都支持自动解密。若要配置无需自动加密的自动解密,请在bypass_auto_encryption=True类中设置options::auto_encryption。
我相信bypassAutoEncryption的选择就是为了这个目的。
发布于 2021-09-27 03:38:18
不是一个确切的答案,但这是目前最好的解决方案。我报告这是官方JIRA上的一个bug。
结果,这显然是一个带有节点-mongo-原生库的错误。根据他们的评论,这应该在下一个版本中解决。
https://stackoverflow.com/questions/69049603
复制相似问题