使用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
相关产品推荐
相关产品推荐

