我想通过 Cloudfront 使用签名 URL 将文件上传到 S3。
Cloudfront 行为中允许 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用户也有读、写权限。
当我尝试上传带有签名 URL 的文件时。
curl -v -X PUT -F [email protected] /cdn-cgi/l/email-protection http://my-host.cloudfront.net/hello.txt?Expires=1514764800&Signature=MySig&Key-Pair-Id=My-KeyPair
我有一个错误:
InvalidRequest
不支持您提供的授权机制。请使用AWS4-HMAC-SHA256。 5D5DEF3D06F4583C8rBCpTUzYwm1ccc8IfkNtUnkuLxr3RZ2n7xn1j+VvP5dpG+3NMpHKPiNQ5tKpJjVliZ9UBI52vk=
Log:
2017-06-19 03:23:08 FRA54 726 My-IP 放置
my-host.cloudfront.net /hello.txt 400 -
卷曲/7.50.1
过期=1514764800&Signature=My-Sig&Key-Pair-Id=My-KeyPair
- 错误MMHwKFzGuBzrlgP0yV71elcwEp2RVBAwJRJD1A5rO4Na6UmeKvcZPQ==
my-host.cloudfront.net http 838 0.235 - --
错误 HTTP/1.1
另外,GET、DELETE 也可以正常工作。
来自 CloudFront 文档:
如果您使用源访问身份,并且您的存储桶位于需要签名版本 4 进行身份验证的区域之一,请注意以下事项:
DELETE
, GET
, HEAD
, OPTIONS
, and PATCH
无条件支持请求。
如果您想提交PUT
请求 CloudFront 将对象上传到您的 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 http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#private-content-origin-access-identity-signature-version-4
您需要将对象主体的 SHA256 的十六进制表示形式添加到x-amz-content-sha256
请求标头。
CloudFront 会在 a 中包含此标头似乎出乎意料PUT
作为内部切换到 V4 签名算法的神奇触发器...但由于上传是强制性的,没有它,V4 签名将无效,所以也许它甚至不会尝试 V4(CloudFront 早于 Signature V4) )。对于其他操作,V4 不需要修改用户代理行为,但是对于PUT
,因此,在没有 V2 的情况下,CloudFront 将 V2 作为默认值是有意义的,即使这是错误的,这样现有代码就不会在已经运行的地方出现问题。无论如何,这似乎应该是您的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)