我想通过带有签名网址的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也可以。
答案 0 :(得分:2)
来自CloudFront文档:
如果您正在使用原始访问标识,并且您的存储区位于需要签名版本4进行身份验证的区域之一,请注意以下事项:
DELETE
,GET
,HEAD
,OPTIONS
和PATCH
请求均不受限制。如果您要向CloudFront提交
PUT
个请求以将对象上传到您的Amazon S3存储桶,则必须向请求添加x-amz-content-sha256
标头,并且标头值必须包含SHA256哈希值要求的主体。
您需要在x-amz-content-sha256
请求标头中添加对象正文的SHA256的十六进制表示。
似乎出乎意料的是,CloudFront会在PUT
中使用此标头作为内部切换到V4签名算法的神奇触发器...但由于它是上传必需的,因此V4签名不会&#没有它可以有效,所以也许它甚至不尝试V4(CloudFront提前签名V4)。对于其他操作,V4并不需要修改用户代理行为,但对于PUT
,它会有意义,因为CloudFront在缺席时将V2作为默认值,即使这样&# 39;错了,所以现有代码不会在已经运行的地方中断。无论如何,这似乎应该是你的解决方案。