带有加密环境变量的 Lambda 函数给出解密错误:InvalidCiphertextException:null

问题描述

我有一个 lambda 函数来建立与 atlas 的连接。连接字符串被加密为环境变量。在测试建立连接时,我收到以下错误

2021-06-07T22:48:31.303Z    01ab146e-734f-4f06-a5e9-acfb5635bc3b    INFO    Decrypt error: InvalidCiphertextException: null
    at Request.extractError (/var/task/node_modules/aws-sdk/lib/protocol/json.js:52:27)
    at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/var/task/node_modules/aws-sdk/lib/request.js:688:14)
    at Request.transition (/var/task/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/var/task/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /var/task/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:690:12)
    at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:116:18) {
  code: 'InvalidCiphertextException',time: 
  requestId: 
  statusCode: 400,retryable: false,retryDelay: 62.95362625619481
}

下面是 lambda 函数的部分代码

'use strict'

var MongoClient = require('mongodb').MongoClient;
const AWS = require('aws-sdk');

let atlas_connection_uri;
let cachedDb = null;

exports.handler = (event,context,callback) => {
    var uri = process.env['MONGODB_ATLAS_CLUSTER_URI'];
    
    if (atlas_connection_uri != null) {
        processEvent(event,callback);
    } 
    else {
        const kms = new AWS.KMS();
                kms.decrypt({ CiphertextBlob: new Buffer(uri,'base64') },(err,data) => {
                    if (err) {
                        console.log('Decrypt error:',err);
                        return callback(err);
                    }
                    atlas_connection_uri = data.Plaintext.toString('ascii');
            processEvent(event,callback);
        });
    } 
};

我认为问题可能是因为 Buffer 已被弃用,但我不确定。

如果您提供任何帮助,我们将不胜感激。

解决方法

TLDR:Lambda 更新了如何加密环境变量。

找到解决方案here

这里是分解:

Lambda 将函数名称作为加密上下文传递给 AWS KMS。对于在此更改之前创建的解密函数,您必须更新解密代码并将 Lambda 函数名称作为加密上下文传递。

要获取带有加密上下文的特定开发工具包的 AWS KMS 解密调用代码,请执行以下步骤:

  1. 打开 Lambda 控制台,然后选择函数。

  2. 在函数名称中,选择 Lambda 函数。

  3. 在环境变量中,选择编辑,然后选择添加 环境变量。

  4. 输入密钥和值,然后展开加密配置。

  5. 选择启用传输中加密的帮助程序,然后选择 加密。

  6. 展开解密秘密片段,复制并粘贴类似于以下内容的片段:

    解密 = boto3.client('kms').decrypt( CiphertextBlob=b64decode(ENCRYPTED),EncryptionContext={'LambdaFunctionName': os.environ['AWS_LAMBDA_FUNCTION_NAME']} )['明文'].decode('utf-8')

使用此代码片段解密使用加密助手加密的新环境变量。