You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用KMS解密SSM加密存储参数时遇InvalidCiphertextException错误

解决SSM加密参数解密时的InvalidCiphertextException错误

核心问题:错误的解密方式

你手动调用KMS Decrypt 接口解密SSM参数值的做法是错误的。SSM存储的加密参数并非直接是KMS加密后的原始密文,而是包含了加密数据密钥和加密参数内容的复合结构,无法直接通过KMS Decrypt 接口解析。

正确解法:让SSM自动解密

修改GetParameterCommand的参数,添加WithDecryption: true,SSM会自动调用KMS完成解密,直接返回明文参数值:

import { GetParameterCommand, SSMClient } from '@aws-sdk/client-ssm';

const ssmClient = new SSMClient({ region: process.env.REGION });

try {
    const response = await ssmClient.send(new GetParameterCommand({
        Name: `/path/to/param`,
        WithDecryption: true // 关键:开启自动解密
    }));
    const plaintextValue = response.Parameter?.Value;
    console.log('明文参数值:', plaintextValue);
} catch (error) {
    console.error('错误:', JSON.stringify(error));
}

额外排查点

如果开启WithDecryption后仍然报错,检查以下内容:

  • KMS密钥策略:确认你的Lambda执行角色被允许在该KMS密钥上执行kms:Decrypt操作。KMS的权限控制需要IAM权限和密钥策略同时允许,仅配置IAM权限可能不够。
  • 参数加密密钥匹配:确认SSM参数确实是用你指定的用户管理型KMS密钥加密的,避免参数被误配置为使用AWS管理密钥或其他密钥。
  • Lambda执行环境:确保Lambda的区域与SSM参数、KMS密钥的区域一致,跨区域操作会导致权限或加密上下文不匹配。

为什么手动解密会失败?

SSM在存储加密参数时,会先调用KMS生成数据密钥,用数据密钥加密参数内容,再将加密后的参数内容和加密后的data key一起存储。手动调用KMS Decrypt 时,你传入的是这个复合结构,而非KMS直接返回的CiphertextBlob,因此触发InvalidCiphertextException。

内容的提问来源于stack exchange,提问作者0xBradock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:20:43