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

如何使用boto为带KMS托管密钥的存储桶生成预签名POST请求

使用boto3为SSE-KMS加密存储桶生成预签名POST请求

要为配置了KMS托管密钥的S3存储桶生成预签名POST请求,核心是在POST表单字段中指定SSE-KMS相关的加密参数,以下是具体实现步骤和代码示例:

核心步骤

  • 初始化boto3的S3客户端
  • 定义POST请求的基础参数(存储桶、对象键、过期时间)
  • 添加SSE-KMS加密所需的表单字段
  • 生成预签名POST表单

代码示例

import boto3

# 初始化S3客户端
s3_client = boto3.client('s3')

# 配置参数
bucket_name = "your-encrypted-bucket"
object_key = "path/to/your-object.txt"
expiration = 3600  # 预签名表单有效期(秒)
kms_key_id = "arn:aws:kms:us-east-1:123456789012:key/abcdef-1234-5678-90ab-cdef12345678"  # 替换为你的KMS密钥ID/ARN

# 生成预签名POST表单
response = s3_client.generate_presigned_post(
    Bucket=bucket_name,
    Key=object_key,
    Fields={
        # 指定SSE-KMS加密方式
        'x-amz-server-side-encryption': 'aws:kms',
        # 指定KMS密钥(使用存储桶默认加密密钥时可省略该字段)
        'x-amz-server-side-encryption-aws-kms-key-id': kms_key_id
    },
    Conditions=[
        # 强制上传请求遵循指定加密规则
        {'x-amz-server-side-encryption': 'aws:kms'},
        {'x-amz-server-side-encryption-aws-kms-key-id': kms_key_id}
    ],
    ExpiresIn=expiration
)

# 输出结果
print("预签名POST URL:", response['url'])
print("表单字段:", response['fields'])

关键说明

  1. 表单规则:Fields中必须包含x-amz-server-side-encryption并设为aws:kms;若使用自定义KMS密钥而非存储桶默认密钥,需额外添加x-amz-server-side-encryption-aws-kms-key-id字段。Conditions中的规则用于确保上传请求严格符合加密要求。
  2. 权限要求:生成预签名的IAM实体(用户/角色)需具备:
    • s3:PutObject(目标存储桶及对象路径的写入权限)
    • kms:GenerateDataKey(指定KMS密钥的临时数据密钥生成权限)
  3. 有效期限制:ExpiresIn参数控制表单有效时长,最长不超过7天(604800秒)。

内容的提问来源于stack exchange,提问作者David Wolever

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:30:00