此操作不支持x-amz-server-side-encryption标头

时间:2017-06-08 02:12:56

标签: amazon-s3 boto3 aws-java-sdk amazon-cloudformation

我正在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

有关

1 个答案:

答案 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(s​​tring) - 用于对象的存储类型。默认为' 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