2017-06-19 1 views
1

Je souhaite télécharger un fichier vers S3 via Cloudfront avec une URL signée. HTTP PUT est autorisé dans le comportement Cloudfront. Politique BucketAmazon S3 ne peut pas télécharger de fichier via Cloudfront

   { 
     "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/*" 
    } 

HTTP PUT est autorisé dans la configuration CORS. Cloudfront utilisateur a également lu, écrit autorisation. Lorsque j'essaie de télécharger un fichier avec une URL signée.

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

J'ai une erreur:

InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256. 5D5DEF3D06F4583C8rBCpTUzYwm1ccc8IfkNtUnkuLxr3RZ2n7xn1j+VvP5dpG+3NMpHKPiNQ5tKpJjVliZ9UBI52vk=

Log:

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 - Error MMHwKFzGuBzrlgP0yV71elcwEp2RVBAwJRJD1A5rO4Na6UmeKvcZPQ==
my-host.cloudfront.net http 838 0.235 - --
Error HTTP/1.1

En outre, GET, SUPPRIMER fonctionne très bien.

Répondre

1

De la documentation CloudFront:

If you're using an origin access identity and if your bucket is in one of the regions that requires signature version 4 for authentication, note the following:

DELETE , GET , HEAD , OPTIONS , and PATCH requests are supported without qualifications.

If you want to submit PUT requests to CloudFront to upload objects to your Amazon S3 bucket, you must add an x-amz-content-sha256 header to the request, and the header value must contain a SHA256 hash of the body of the request.

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

Vous aurez besoin d'ajouter la représentation hexadécimale du SHA256 du corps d'objet dans un en-tête de demande x-amz-content-sha256. Il semble inattendu que CloudFront utilise l'inclusion de cet en-tête dans un PUT comme déclencheur magique pour passer en interne à l'algorithme de signature V4 ... mais comme il est obligatoire pour les téléchargements, la signature V4 ne serait pas valide sans cela, alors peut-être qu'il n'essaie même pas V4 (CloudFront est antérieur à la Signature V4). Pour les autres opérations, V4 ne nécessite pas de modifications du comportement de l'agent utilisateur, mais pour PUT, il serait logique que CloudFront utilise V2 par défaut en son absence, même si c'est faux, de sorte que le code existant ne le soit pas. Ne vous arrêtez pas là où il travaillait déjà. Quoi qu'il en soit, cela semble être la solution.

+0

@unknown est-ce que cela a résolu votre problème? Est-ce que [ce message du forum AWS] (https://forums.aws.amazon.com/thread.jspa?threadID=258104) vous appartient également? –

+0

Oui c'était de l'aide. – unknown