2010-04-13 26 views
5
साथ CloudFront के लिए हस्ताक्षर किए यूआरएल बनाने

इतिहास:रूबी

  1. मैं अमेज़न पर एक महत्वपूर्ण और पीईएम फ़ाइल बनाई।
  2. मैं एक निजी बाल्टी
  3. मैं एक सार्वजनिक वितरण और इस्तेमाल किया मूल आईडी बनाई निजी बकेट से कनेक्ट करने के लिए बनाया: काम करता है
  4. मैं एक निजी वितरण बनाया है और # 3 के रूप में यह एक ही जुड़ा हुआ है - अब मैं पहुँच से मना कर पाने :

मुझे एक यूआरएल उत्पन्न करने में वास्तव में कठिन समय हो रहा है जो काम करेगा।

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) 

किसी को भी बता सकते हैं: - अभी भी हो रही पहुँच से मना कर http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?PrivateContent.html

यह मैं क्या मिल गया है अब तक ... हालांकि काम नहीं करता है: मैं दिशाओं यहाँ वर्णित का पालन करने की कोशिश कर रहा है मैं यहाँ क्या गलत कर रहा हूँ?

उत्तर

11

सभी

मैं सिर्फ एक छोटे से बनाया मणि कि रूबी इस सवाल से कोड के कुछ का उपयोग कर के साथ सीएफ यूआरएल हस्ताक्षर करने के लिए इस्तेमाल किया जा सकता:

https://github.com/stlondemand/aws_cf_signer

मैं शायद आने वाले हफ्तों में इसे करने के लिए महत्वपूर्ण बदलाव करने दिया जाएगा के रूप में मैं tr वास्तव में इसे मेरे आवेदन में उपयोग करने के लिए, लेकिन आप सभी को यह बताने के लिए चाहते थे कि आप विशेषता अनुभाग में सूचीबद्ध हैं। :)

धन्यवाद!

2

निकालें url_safe इससे पहले कि आप नीति सेट: डॉक्स के अनुसार नीति = policy_for_resource (संसाधन, समाप्त हो जाएगा)

केवल Base64 होना चाहिए सुरक्षित यूआरएल-सुरक्षित (एम) = CharReplace (Base64 (एम), "+ =/"" -_ ~ ")

.. और यह सुनिश्चित करें कि CloudFront तरह ठीक से कॉन्फ़िगर किया गया है: http://blog.cloudberrylab.com/2010/03/how-to-configure-private-content-for.html

1

हाँ, के रूप में policy = policy_for_resource(resource, expires) मेरे लिए काम किया नीति छोड़कर।

1

मैं right_aws काँटेदार (वे मेरी पुल अनुरोध का जवाब नहीं दिया) ... मैं उनके एसीएफ़ पुस्तकालय में CloudFront निजी स्ट्रीमिंग और डाउनलोड की स्थापना:, http://github.com/wiseleyb/right_aws

1

मैं डायलन से सहमत हूं। उन्होंने यूआरएल पर हस्ताक्षर करने के साथ अच्छा काम किया। मेरी भी यही समस्या थी। मैं दस्तावेज़ों के माध्यम से चला गया। एक बात है कि मुझे वहां नहीं मिला। जब आप एक निजी वितरण बनाते हैं, तो आप आमतौर पर फाइलों, बाल्टी, आदि के लिए पहुंच प्रदान करते हैं ...

मुझे बाल्टी नीति असाइन किए जाने तक एक्सेस अस्वीकृत त्रुटियां मिलीं।

{ 
    "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/*" 
     } 
    ] 
} 
:

आप की तरह नीति असाइन कर सकते हैं