Amazon S3 无法通过 Cloudfront 上传文件

unk*_*own 6 amazon amazon-s3 amazon-cloudfront

我想通过带有签名 URL 的 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/*"
    }
Run Code Online (Sandbox Code Playgroud)

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

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

我有一个错误:

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 -
curl/7.50.1
Expires=1514764800&Signature=My-Sig&Key-Pair-Id=My-KeyPair -错误 MMHwKFzGuBzrlgP0yV71elcwEp2RVBAwJRJD1A5rO4Na6UmeKvcZPQ==
my-host.cloudfront.net http 838 0.235 - --
错误 HTTP/1.1

此外,GET,DELETE 工作正常。

Mic*_*bot 6

从 CloudFront 文档:

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

DELETEGETHEADOPTIONSPATCH请求不受限制地支持。

如果您想向PUTCloudFront提交请求以将对象上传到您的 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 将使用包含在 a 中的此标头PUT作为内部切换到 V4 签名算法的魔术触发器似乎出乎意料……但由于上传是强制性的,没有它 V4 签名将无效,所以也许它甚至不尝试 V4(CloudFront 早于 Signature V4)。对于其他操作,V4 不需要修改用户代理行为,但是对于PUT,CloudFront 将 V2 作为默认值是有意义的,即使这是错误的,这样现有代码也不会t 在它已经工作的地方中断。无论如何,这似乎应该是您的解决方案。