Создайте подписанные URL-адреса для CloudFront с Ruby - PullRequest
6 голосов
/ 13 апреля 2010

История:

  1. Я создал файл ключа и pem на Amazon.
  2. Я создал личное ведро
  3. Я создал общедоступный дистрибутив и использовал идентификатор источника для подключения к приватному сегменту: works
  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)

Может кто-нибудь сказать мне, что я здесь делаю не так?

Ответы [ 5 ]

11 голосов
/ 18 ноября 2010

Все,

Я только что создал маленький гем, который можно использовать для подписи CF-URL с помощью Ruby, используя часть кода из этого вопроса:

https://github.com/stlondemand/aws_cf_signer

Я, вероятно, внесу в него значительные изменения в ближайшие недели, поскольку я попытаюсь использовать его в своем приложении, но хотел бы, чтобы вы все знали, как вы перечислены в разделе атрибуции. :)

Спасибо!

2 голосов
/ 24 апреля 2010

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

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

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

1 голос
/ 02 декабря 2010

Я согласен с Диланом. Он хорошо поработал, подписав URL. Я была такая же проблема. Я прошел через документы. Есть одна вещь, которую я не нашел там. Когда вы создаете частный дистрибутив, вы обычно предоставляете доступ к файлам, корзинам и т. Д. *

Я получал ошибки «Отказано в доступе», пока не назначил Bucket Policy.

Вы можете назначить политику как:

{
    "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/*"
        }
    ]
}
1 голос
/ 18 мая 2010

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

1 голос
/ 28 апреля 2010

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

...