Créer signé urls pour CloudFront avec Ruby
-
26-09-2019 - |
Question
Histoire:
- J'ai créé un fichier clé et GDP sur Amazon.
- Je créé un seau privé
- Je créé une distribution publique et id origine utilisé pour se connecter au seau privé: travaux
- Je créé une distribution privée et connecté le même que # 3 - maintenant je me voient refuser l'accès: attendu
Je vais avoir un temps vraiment difficile de générer une URL qui fonctionne. J'ai essayé de suivre les instructions décrites ici: http: / /docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?PrivateContent.html
est ce que j'ai jusqu'à présent ... ne fonctionne pas bien - encore avoir accès refusé:
def url_safe(s)
s.gsub('+','-').gsub('=','_').gsub('/','~').gsub(/\n/,'').gsub(' ','')
end
def policy_for_resource(resource, expires = Time.now + 1.hour)
%({"Statement":[{"Resource":"#{resource}","Condition":{"DateLessThan":{"AWS:EpochTime":#{expires.to_i}}}}]})
end
def signature_for_resource(resource, key_id, private_key_file_name, expires = Time.now + 1.hour)
policy = url_safe(policy_for_resource(resource, expires))
key = OpenSSL::PKey::RSA.new(File.readlines(private_key_file_name).join(""))
url_safe(Base64.encode64(key.sign(OpenSSL::Digest::SHA1.new, (policy))))
end
def expiring_url_for_private_resource(resource, key_id, private_key_file_name, expires = Time.now + 1.hour)
sig = signature_for_resource(resource, key_id, private_key_file_name, expires)
"#{resource}?Expires=#{expires.to_i}&Signature=#{sig}&Key-Pair-Id=#{key_id}"
end
resource = "http://d27ss180g8tp83.cloudfront.net/iwantu.jpeg"
key_id = "APKAIS6OBYQ253QOURZA"
pk_file = "doc/pk-APKAIS6OBYQ253QOURZA.pem"
puts expiring_url_for_private_resource(resource, key_id, pk_file)
Quelqu'un peut-il me dire ce que je fais mal ici?
La solution
Tous,
Je viens de créer un petit bijou qui peut être utilisé pour signer des URL CF avec Ruby en utilisant une partie du code de cette question:
https://github.com/stlondemand/aws_cf_signer
Je vais probablement apporter des changements importants à ce au cours des prochaines semaines que j'essaie d'utiliser réellement dans ma demande mais je voulais vous laisser savoir que tous vous êtes inscrit dans la section attributions. :)
Merci!
Autres conseils
supprimer url_safe avant de définir la politique: politique = policy_for_resource (ressource, expire)
selon docs ne base64 doit être sûr Url-Safe (m) = CharReplace (base64 (m), "+ = /", "-_ ~")
.. et assurez-vous que CloudFront est correctement configuré comme: http://blog.cloudberrylab.com/ 2010/03 / how-to-configure-contenu privé for.html
Oui, en laissant la politique comme policy = policy_for_resource(resource, expires)
a fonctionné pour moi.
Je fourchue right_aws (ils ont pas répondu à ma demande de traction) ... Je mis en place le streaming privé CloudFront et téléchargements dans leur bibliothèque acf: http://github.com/wiseleyb/right_aws
Je suis d'accord avec Dylan. Il a fait du bon travail avec urls signature. J'ai eu le même problème. Je suis passé par la documentation. Il y a une chose que je ne trouve pas là. Lorsque vous créez une distribution privée, vous donne habituellement accès pour les fichiers, seau, etc ...
Je suis erreurs d'accès refusé jusqu'à ce que je Bucket politique affecté.
Vous pouvez affecter la politique comme:
{
"Version":"2008-10-17",
"Id":"PolicyForCloudFrontPrivateContent",
"Statement":[{
"Sid":" Grant a CloudFront Origin Identity access to support private content",
"Effect":"Allow",
"Principal":{
"CanonicalUser":"here-goes-your-canonical-name-you-attached-to-cloudfront79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be"
},
"Action":"s3:GetObject",
"Resource":"arn:aws:s3:::change-me-to-your-bucketname/*"
}
]
}