如何解决 AWS KMS 解密错误“InvalidCiphertextException”?

上次更新时间:2021 年 2 月 15 日

我尝试使用 AWS Lambda 加密助手来解密环境变量,然后收到错误消息“InvalidCiphertextException”。所有 AWS Identity and Access Management (IAM) 和 AWS Key Management Service (AWS KMS) 权限都是正确的。

简短描述

AWS KMS API 操作错误 InvalidCiphertextException 表示解密请求失败,因为 Lambda 更新了环境变量加密的方式。Lambda 将函数名称作为加密调用的加密上下文传递给 AWS KMS。对于在此更改之前创建的解密函数,您必须更新解密代码,并将 Lambda 函数名称作为加密上下文传递。

解决方法

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

    打开 Lambda 控制台,然后选择 Functions(函数)。 在 Function name(函数名称)中,选择该 Lambda 函数。 在 Environment variable(环境变量)中,选择 Edit(编辑),然后选择 Add environment variable(添加环境变量)。 输入一个 Key(密钥)和 Value(值),然后展开 Encryption configuration(加密配置)。 选择 Enable helpers for encryption in transit(启用传输中加密助手),然后选择 Encrypt(加密)。 展开 Decrypt secret snippet(解密密码段),复制并粘贴与以下类似的代码段:
DECRYPTED = boto3.client('kms').decrypt(
    CiphertextBlob=b64decode(ENCRYPTED),
    EncryptionContext={'LambdaFunctionName': os.environ}
).decode('utf-8')

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

请务必重新加密旧环境变量,以便它们能够支持新的环境变量。

有关更多信息,请参阅使用 AWS Lambda 环境变量。