Amazon CloudFront Signed URLs funcionan de manera diferente a las URL firmadas por Amazon S3. CloudFront utiliza firmas RSA basadas en un par de claves de CloudFront separado que debe configurar en su página de credenciales de cuenta de Amazon. Aquí hay algo de código para generar realmente una URL de duración limitada en Python usando la biblioteca de M2Crypto:
Crear un par de claves para CloudFront
Creo que la única manera de hacer esto es a través de la página web de Amazon. Vaya a la página "Cuenta" de AWS y haga clic en el enlace "Credenciales de seguridad". Haga clic en la pestaña "Pares clave" y luego haga clic en "Crear un nuevo par de claves". Esto generará un nuevo par de claves para usted y descargará automáticamente un archivo de clave privada (pk-xxxxxxxxx.pem). Mantenga el archivo de clave seguro y privado. También anote el "ID del par de claves" de Amazon, ya que lo necesitaremos en el siguiente paso.
generar algo de direcciones URL en Python
partir de la versión 2.0 boto no parece ser ningún apoyo para la generación de direcciones URL CloudFront firmados. Python no incluye las rutinas de encriptación RSA en la biblioteca estándar, por lo que tendremos que usar una biblioteca adicional. He usado M2Crypto en este ejemplo.
Para una distribución sin transmisión, debe usar la URL completa en la nube como recurso, sin embargo, para la transmisión, solo usamos el nombre del objeto del archivo de video. Consulte el siguiente código para obtener un ejemplo completo de generación de una URL que solo dura 5 minutos.
Este código se basa libremente en el código de ejemplo de PHP proporcionado por Amazon en la documentación de CloudFront.
from M2Crypto import EVP
import base64
import time
def aws_url_base64_encode(msg):
msg_base64 = base64.b64encode(msg)
msg_base64 = msg_base64.replace('+', '-')
msg_base64 = msg_base64.replace('=', '_')
msg_base64 = msg_base64.replace('/', '~')
return msg_base64
def sign_string(message, priv_key_string):
key = EVP.load_key_string(priv_key_string)
key.reset_context(md='sha1')
key.sign_init()
key.sign_update(message)
signature = key.sign_final()
return signature
def create_url(url, encoded_signature, key_pair_id, expires):
signed_url = "%(url)s?Expires=%(expires)s&Signature=%(encoded_signature)s&Key-Pair-Id=%(key_pair_id)s" % {
'url':url,
'expires':expires,
'encoded_signature':encoded_signature,
'key_pair_id':key_pair_id,
}
return signed_url
def get_canned_policy_url(url, priv_key_string, key_pair_id, expires):
#we manually construct this policy string to ensure formatting matches signature
canned_policy = '{"Statement":[{"Resource":"%(url)s","Condition":{"DateLessThan":{"AWS:EpochTime":%(expires)s}}}]}' % {'url':url, 'expires':expires}
#sign the non-encoded policy
signature = sign_string(canned_policy, priv_key_string)
#now base64 encode the signature (URL safe as well)
encoded_signature = aws_url_base64_encode(signature)
#combine these into a full url
signed_url = create_url(url, encoded_signature, key_pair_id, expires);
return signed_url
def encode_query_param(resource):
enc = resource
enc = enc.replace('?', '%3F')
enc = enc.replace('=', '%3D')
enc = enc.replace('&', '%26')
return enc
#Set parameters for URL
key_pair_id = "APKAIAZVIO4BQ" #from the AWS accounts CloudFront tab
priv_key_file = "cloudfront-pk.pem" #your private keypair file
# Use the FULL URL for non-streaming:
resource = "http://34254534.cloudfront.net/video.mp4"
#resource = 'video.mp4' #your resource (just object name for streaming videos)
expires = int(time.time()) + 300 #5 min
#Create the signed URL
priv_key_string = open(priv_key_file).read()
signed_url = get_canned_policy_url(resource, priv_key_string, key_pair_id, expires)
print(signed_url)
#Flash player doesn't like query params so encode them if you're using a streaming distribution
#enc_url = encode_query_param(signed_url)
#print(enc_url)
Asegúrese de que configura su distribución con un parámetro TrustedSigners ajustado a la cuenta de haberes de su par de claves (o "Auto" si es su propia cuenta)
Ver Getting started with secure AWS CloudFront streaming with Python para un trabajado completamente ejemplo sobre cómo configurar esto para el streaming con Python
Por cierto, cambie a uWSGI y su FastCGI no se bloqueará más. –