Создайте подписанные URL для CloudFront с Ruby

История:

  1. Я создал ключ и pem файл на Amazon.
  2. Я создал частный блок
  3. Я создал общедоступное распределение и использовал идентификатор источника для соединения с частным блоком: работы
  4. Я создал частное распределение и соединил его то же как № 3 - теперь я получаю доступ запрещен: ожидаемый

Мне действительно нелегко генерировать URL, который будет работать. Я пытался следовать за направлениями, описанными здесь: http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?PrivateContent.html

Это - то, что я имею, до сих пор... не работает хотя - все еще получение доступа запрещен:

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)

Кто-либо может сказать мне, что я делаю неправильно здесь?

6
задан Ben Wiseley 13 April 2010 в 19:10
поделиться

3 ответа

удалите url_safe перед установкой политики: policy = policy_for_resource (resource, expires)

согласно документам только Base64 должен быть безопасным URL -Safe (m) = CharReplace (Base64 (m), "+ = /", "-_ ~")

.. и убедитесь, что CloudFront настроен правильно, например: http: //blog.cloudberrylab.com/2010/03/how-to-configure-private-content-for.html

2
ответ дан 8 December 2019 в 14:41
поделиться

Ага, оставив политику как policy = policy_for_resource (resource, expires) , у меня сработало.

1
ответ дан 8 December 2019 в 14:41
поделиться

Я разветвил right_aws (они не ответили на мой запрос на перенос) ... Я установил облачную потоковую передачу и загрузку в их библиотеке acf: http://github.com/wiseleyb/right_aws

1
ответ дан 8 December 2019 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: