使用AWS KMS解密本地加密文件时遇InvalidCiphertextException求助
AWS KMS本地文件解密失败排查与解决
问题背景
已通过AWS控制台创建客户托管KMS密钥,使用AWS CLI加密本地文件成功,但解密时遇到报错;调整路径前缀后报错消失,却出现解密结果与原文件内容不符的问题。
KMS密钥信息
执行aws kms describe-key命令输出如下:
{ "KeyMetadata": { "AWSAccountId": "<redacted>", "KeyId": "<redacted>", "Arn": "arn:aws:kms:eu-west-2:<redacted>:key/<redeacted>", "CreationDate": "2022-11-01T14:02:40.684000+00:00", "Enabled": true, "Description": "CST MED1 FORT-B", "KeyUsage": "ENCRYPT_DECRYPT", "KeyState": "Enabled", "Origin": "AWS_KMS", "KeyManager": "CUSTOMER", "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT", "KeySpec": "SYMMETRIC_DEFAULT", "EncryptionAlgorithms": [ "SYMMETRIC_DEFAULT" ], "MultiRegion": false } }
加密操作(执行成功)
使用以下命令加密本地文件field342med1,生成加密文件field342med1.encrypted:
aws kms encrypt --key-id <redacted> --plaintext fileb://field342med1 --output text --query CiphertextBlob --region eu-west-2 > field342med1.encrypted
解密操作问题
- 初始解密命令触发报错:
aws kms decrypt --ciphertext-blob fileb://field342med1.encrypted --query Plaintext
报错信息:
An error occurred (InvalidCiphertextException) when calling the Decrypt operation:
- 将
fileb://改为file://后报错消失,但解密输出内容与原明文文件完全不符。
原因分析与解决方法
核心原因
加密时使用--output text --query CiphertextBlob,把加密后的二进制数据Base64编码为文本格式写入了文件,但解密时:
- 用
fileb://会直接读取文件的二进制内容,而文件实际是Base64文本,导致传入的CiphertextBlob格式错误,触发InvalidCiphertextException。 - 用
file://读取文本后,AWS CLI会自动将其视为Base64编码内容解码,但解密后的Plaintext默认会以Base64格式输出,直接查看显示的是编码字符串而非原文件内容。
正确解密步骤
方法1:适配现有加密文件的解密命令
解密时指定输出格式为文本,再通过base64解码还原原文件:
aws kms decrypt --ciphertext-blob file://field342med1.encrypted --output text --query Plaintext --region eu-west-2 | base64 --decode > field342med1.decrypted
可通过以下命令验证结果一致性:
diff field342med1 field342med1.decrypted
方法2:使用二进制模式处理加密文件(推荐)
如果加密时直接输出二进制数据,解密流程会更直观:
- 加密命令(直接输出二进制):
aws kms encrypt --key-id <redacted> --plaintext fileb://field342med1 --output binary --query CiphertextBlob --region eu-west-2 > field342med1.encrypted.bin
- 解密命令(读取二进制加密文件):
aws kms decrypt --ciphertext-blob fileb://field342med1.encrypted.bin --output binary --query Plaintext --region eu-west-2 > field342med1.decrypted
关键注意点
fileb://用于读取二进制文件,file://用于读取文本文件,需根据加密时输出的文件格式选择对应前缀。- AWS CLI的
--output text会将二进制字段(如CiphertextBlob、Plaintext)自动做Base64编码,--output binary则直接输出原始二进制数据。 - 解密后的
Plaintext若用--output text输出,必须经过Base64解码才能还原原文件内容。
内容的提问来源于stack exchange,提问作者RizAcn
相关产品推荐
相关产品推荐

