1

Vous tentez de configurer une URL cloudfront entièrement signée et protégée. E.g. Je souhaite qu'un code d'application soit requis pour accéder à la ressource.Cloudfront vs S3 a signé l'URL et Boto3

Avec S3 distribution directe que je peux le faire simplement avec:

s3 = boto3.client('s3')  
s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': unique_key}, ExpiresIn=186400) 

Mais je ne peux pas sembler comprendre comment créer l'URL équivalent signé lors d'une demande URL CloudFront.

Répondre

4

La documentation boto3 a une section montrant Generate a signed URL for Amazon CloudFront:

L'exemple suivant montre comment générer une URL signé pour Amazon CloudFront. Notez que vous aurez besoin de la bibliothèque de cryptographie à suivre cet exemple:

import datetime 

from cryptography.hazmat.backends import default_backend 
from cryptography.hazmat.primitives import hashes 
from cryptography.hazmat.primitives import serialization 
from cryptography.hazmat.primitives.asymmetric import padding 
from botocore.signers import CloudFrontSigner 
def rsa_signer(message): 
    with open('path/to/key.pem', 'rb') as key_file: 
     private_key = serialization.load_pem_private_key(
      key_file.read(), 
      password=None, 
      backend=default_backend() 
     ) 
    signer = private_key.signer(padding.PKCS1v15(), hashes.SHA1()) 
    signer.update(message) 
    return signer.finalize() 

key_id = 'AKIAIOSFODNN7EXAMPLE' 
url = 'http://d2949o5mkkp72v.cloudfront.net/hello.txt' 
expire_date = datetime.datetime(2017, 1, 1) 

cloudfront_signer = CloudFrontSigner(key_id, rsa_signer) 

# Create a signed url that will be valid until the specfic expiry date 
# provided using a canned policy. 
signed_url = cloudfront_signer.generate_presigned_url(
    url, date_less_than=expire_date) 
print(signed_url) 

CloudFront vs S3

Vous remarquerez que le code ci-dessus utilise une paire de clés publique/privée pour créer le CloudFront signé URL Cela signifie que n'importe quelle application peut générer une URL signée tant qu'elle connaît la paire de clés.

Ceci est différent de la création d'URL signées dans Amazon S3, qui utilise la clé secrète appartenant à l'utilisateur qui a généré la demande d'authentification de la demande.

Pourquoi sont-ils différents? Je ne sais pas, mais l'option keypair permet l'utilisation de CloudFront sans avoir besoin d'utilisateurs IAM, ce qui peut être utile pour les clients qui n'utilisent que CloudFront. Mais c'est juste une supposition.

+0

Merci, j'ai vu ça bien sûr. Mais ceci, contrairement à une URL S3 directe, nécessite la signature d'une clé, avec mon RSA privé. Est-ce le seul moyen? Pourquoi y a-t-il une différence entre S3 et Cloudfront? cela n'a aucun sens pour moi, peut-être que vous pouvez expliquer le diff. –

+0

Je ne sais pas pourquoi, mais j'ai ajouté du texte sur la différence. –

+0

Mais le boto3 a '403' lorsqu'il accède au téléchargement du fichier par l'URL signée. – jiamo