使用预签名URL访问KMS加密S3文件时遇Signature Version 4错误排查
S3预签名URL访问KMS加密对象报错解决方案
生成预签名URL访问启用了默认KMS加密的S3对象时,收到如下错误:
<Error> <Code>InvalidArgument</Code> <Message>Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.</Message> <ArgumentName>Authorization</ArgumentName> <ArgumentValue>null</ArgumentValue> <RequestId>F6VK4TD1S0G4K6YR</RequestId> <HostId>HOTh/YUsnxC4sSBYVsK5psX5vBz21q1M/qx+pVmKa6s7Np4EbRUbBV4toRJ52OAtqpHIejY03Zk=</HostId> </Error>
生成URL的代码为:
client.generate_presigned_url('get_object', Params={'Bucket': 'bucket1', 'Key': a})
即使使用boto3默认配置仍出现该问题,可通过以下方式排查解决:
- 显式指定签名版本:创建boto3 S3客户端时,强制配置使用Signature Version 4,避免默认配置因环境差异出现异常。示例代码:
import boto3 from botocore.config import Config s3_client = boto3.client('s3', config=Config(signature_version='s3v4')) presigned_url = s3_client.generate_presigned_url('get_object', Params={'Bucket': 'bucket1', 'Key': a})
确认客户端区域配置:确保boto3客户端的区域与S3存储桶所在区域完全一致。部分场景下,区域未明确指定时,boto3可能采用兼容模式,导致签名版本不符合要求。
验证存储桶加密类型:确认存储桶启用的是AWS KMS托管密钥加密(而非SSE-S3),因为只有KMS加密的对象要求必须使用V4签名访问。
内容的提问来源于stack exchange,提问作者elena
相关产品推荐
相关产品推荐

