7
votes

Créer des URL signées pour Cloudfront avec Ruby

Historique:

  1. J'ai créé un fichier clé et PEM sur Amazon. LI>
  2. J'ai créé un godet privé li>
  3. J'ai créé une distribution publique et une carte d'identité d'origine utilisée pour vous connecter au godet privé: fonctionne li>
  4. J'ai créé une distribution privée et j'ai connecté la même chose que le n ° 3 - maintenant je reçois accès refusé: attendu li> OL>

    J'ai un temps vraiment difficile générant une URL qui fonctionnera. J'ai essayé de suivre les instructions décrites ici: http: / /docs.amazonwebservices.com/amazoncloudfront/latest/developerguide/index.html?privatecontent.html P>

    C'est ce que j'ai jusqu'ici ... ne fonctionne pas mais toujours Obtenir l'accès refusé: P>

    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)
    


0 commentaires

6 Réponses :


2
votes

Supprimer URL_Safe Avant de définir la stratégie: Politique = politique_for_resource (ressource, expire)

Selon Docs, la base64 devrait être une URL sécuritaire (M) = charreplace (base64 (m), "+ = /", "-_ ~")

.. et assurez-vous que Cloudfront est configuré correctement comme: http://blog.cloudberryLab.com/ 2010/03 / comment configurer-configuration-privé-contenu-for.html


0 commentaires

1
votes

Oui, de la stratégie de départ en tant que stratégie = stratégie_for_resource (ressource, expiration) a travaillé pour moi.


0 commentaires

1
votes

i Forked Right_aws (ils n'ont pas répondu à ma demande de traction) ... Je configurais le streaming privé de Cloudfront et des téléchargements dans leur bibliothèque ACF: http://github.com/wiseleyb/right_aws


0 commentaires

11
votes

Tous,

Je viens de créer un petit bijou pouvant ê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 dans les prochaines semaines, alors que j'essaie de l'utiliser dans ma candidature, mais je voulais tout vous permettre de savoir que vous êtes répertorié dans la section Attributions. :)

Merci!


0 commentaires

1
votes

Je suis d'accord avec Dylan. Il a fait du bon travail avec la signature des URL. J'ai eu le même problème. J'ai traversé les docs. Il y a une chose que je ne trouvais pas là-bas. Lorsque vous créez une distribution privée, vous donnez généralement accès aux fichiers, seau, etc ...

J'ai accès à des erreurs refusées jusqu'à ce que je assignais une stratégie de godet.

Vous pouvez attribuer des stratégies telles que: xxx


0 commentaires

1
votes

C'est une question ancienne, mais il y a toujours très peu de choses sur la signature des URL de Cloudfront à l'aide du Ruby SDK, en ajoutant une aide mise à jour. Il y a maintenant un Cloudfront SDK qui rend cette assez facile: xxx


0 commentaires