Amazon S3无法通过Cloudfront上传文件

时间:2017-06-19 03:32:05

标签: amazon-s3 amazon amazon-cloudfront

我想通过带有签名网址的Cloudfront将文件上传到S3。 Cloudfront Behavior中允许HTTP PUT。 存储桶政策

             {
        "Sid": "2",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E1C2T5UJU07REZ"
        },
        "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:GetObject"
        ],
        "Resource": "arn:aws:s3:::testback/*"
    }

在CORS配置中允许HTTP PUT。 Cloudfront用户还具有读取,写入权限。 当我尝试使用签名网址上传文件时。

curl -v -X PUT -F file=@hello.txt  http://my-host.cloudfront.net/hello.txt?Expires=1514764800&Signature=MySig&Key-Pair-Id=My-KeyPair

我收到了错误:

  

InvalidRequest不支持您提供的授权机制。请使用AWS4-HMAC-SHA256。 5D5DEF3D06F4583C8rBCpTUzYwm1ccc8IfkNtUnkuLxr3RZ2n7xn1j + VvP5dpG + 3NMpHKPiNQ5tKpJjVliZ9UBI52vk =

日志:

  

2017-06-19 03:23:08 FRA54 726 My-IP PUT
  my-host.cloudfront.net /hello.txt 400 -
  卷曲/ 7.50.1
  过期= 1514764800&放大器;签名=我-SIG和放大器;密钥对-ID = MY-密钥对    - 错误MMHwKFzGuBzrlgP0yV71elcwEp2RVBAwJRJD1A5rO4Na6UmeKvcZPQ ==
  my-host.cloudfront.net http 838 0.235 - -
  错误HTTP / 1.1

此外,GET,DELETE也可以。

1 个答案:

答案 0 :(得分:2)

来自CloudFront文档:

  

如果您正在使用原始访问标识,并且您的存储区位于需要签名版本4进行身份验证的区域之一,请注意以下事项:

     

DELETEGETHEADOPTIONSPATCH请求均不受限制。

     

如果您要向CloudFront提交PUT个请求以将对象上传到您的Amazon S3存储桶,则必须向请求添加x-amz-content-sha256标头,并且标头值必须包含SHA256哈希值要求的主体。

     

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#private-content-origin-access-identity-signature-version-4

您需要在x-amz-content-sha256请求标头中添加对象正文的SHA256的十六进制表示。

似乎出乎意料的是,CloudFront会在PUT中使用此标头作为内部切换到V4签名算法的神奇触发器...但由于它是上传必需的,因此V4签名不会&#没有它可以有效,所以也许它甚至不尝试V4(CloudFront提前签名V4)。对于其他操作,V4并不需要修改用户代理行为,但对于PUT,它会有意义,因为CloudFront在缺席时将V2作为默认值,即使这样&# 39;错了,所以现有代码不会在已经运行的地方中断。无论如何,这似乎应该是你的解决方案。