如何解决 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 解密调用代码,请按照以下步骤操作:

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

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

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

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