Amazon CloudFront Signed URLs funzionano in modo diverso rispetto agli URL firmati Amazon S3. CloudFront utilizza le firme RSA basate su una coppia di chiavi CloudFront separata che devi configurare nella pagina delle credenziali dell'account Amazon. Ecco un po 'di codice per generare in realtà un URL a tempo limitato in Python utilizzando la libreria M2Crypto:
Creare una coppia di chiavi per CloudFront
Credo che l'unico modo per farlo è attraverso il sito web di Amazon. Vai nella pagina "Account" di AWS e fai clic sul link "Credenziali di sicurezza". Fare clic sulla scheda "Coppie di chiavi", quindi fare clic su "Crea una nuova coppia di chiavi". Questo genererà una nuova coppia di chiavi per te e scaricherà automaticamente un file di chiave privata (pk-xxxxxxxxx.pem). Mantieni il file chiave sicuro e privato. Annota anche il "Key Pair ID" di Amazon, come avremo bisogno nel prossimo passaggio.
generare alcuni URL in Python
Come di boto versione 2.0 non sembra essere alcun supporto per la generazione di URL CloudFront firmati. Python non include le routine di crittografia RSA nella libreria standard, quindi dovremo utilizzare una libreria aggiuntiva. Ho usato M2Crypto in questo esempio.
Per una distribuzione non in streaming, è necessario utilizzare l'URL del cloudfront completo come risorsa, tuttavia per lo streaming viene utilizzato solo il nome dell'oggetto del file video. Vedere il codice qui sotto per un esempio completo di generazione di un URL che dura solo per 5 minuti.
Questo codice si basa liberamente sul codice di esempio PHP fornito da Amazon nella documentazione di 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)
Assicurarsi di configurare la distribuzione con un parametro TrustedSigners impostato al conto di deposito propria coppia di chiavi (o "Auto" se è il proprio account)
Vedi Getting started with secure AWS CloudFront streaming with Python per una completamente lavorato ad esempio su come impostare questo in su per lo streaming con Python
In ogni caso, passa a uWSGI e il tuo FastCGI non si arresterà più. –