我正在AWS AMI中运行我的应用程序。 AMI通过云形成模板启动,该模板使用AWS::IAM::Role
创建sts:AssumeRole
角色。一旦EC2实例启动,我使用boto3.create_bucket
从Ec2实例创建一个S3存储桶。
在我的应用程序中,我将文件上传到创建的存储桶,其中包含加密标记。但上传时我收到了错误:
com.amazonaws.services.s3.model.AmazonS3Exception: 此不支持x-amz-server-side-encryption标头 操作。 (服务:Amazon S3;状态代码:400;错误代码: 无效的论点;请求ID:04DD9259D04F92CA),S3扩展请求 ID: EVdqFn6jUNshxUejZFWa6VN / lHPXHyi0F + TG + UZ3K9Sh8Gy0MPABi1AnxZloIajypLb39 / 5UAVA =
这是我的代码的服务器端加密部分:
ObjectMetadata meta = new ObjectMetadata();
meta.setContentLength(contentLength);
meta.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION)
我做错了什么?当我在其他地方运行我的代码并使用S3存储桶时,这可以正常工作。这是否与云形成或sts:AssumeRole
?
答案 0 :(得分:0)
The Put object function in boto3具有设置对象级加密的选项。
object = bucket.put_object(
ServerSideEncryption='AES256'|'aws:kms',
SSECustomerAlgorithm='string',
SSECustomerKey='string',
SSEKMSKeyId='string',
)
ServerSideEncryption(string) - 在S3中存储此对象时使用的服务器端加密算法(例如,AES256,aws:kms)。 StorageClass(string) - 用于对象的存储类型。默认为' STANDARD'。
SSECustomerAlgorithm(string) - 指定加密对象时使用的算法(例如,AES256)。
SSECustomerKey(字符串) - 指定Amazon S3用于加密数据的客户提供的加密密钥。该值用于存储对象,然后丢弃;亚马逊不存储加密密钥。密钥必须适合与x-amz-server-side -encryption -customer-algorithm标头中指定的算法一起使用。> -
SSECustomerKeyMD5(字符串) - 根据RFC 1321指定加密密钥的128位MD5摘要.Amazon S3使用此标头进行消息完整性检查,以确保加密密钥的传输没有错误。请注意,如果未提供此参数,则会自动填充此参数。不需要包含此参数
SSEKMSKeyId(字符串) - 指定用于对象加密的AWS KMS密钥ID。如果不是通过SSL或使用SigV4,对受AWS KMS保护的对象的所有GET和PUT请求都将失败。有关配置任何官方支持的AWS开发工具包和CLI的文档,请访问http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html#specify-signature-version)
http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html