2010-04-13 18 views
5

Historia:Crear URL firmadas para CloudFront con Ruby

  1. he creado un archivo de clave y pem en Amazon.
  2. creé un cubo privada
  3. creé una distribución pública y usado Identificación del origen para conectarse a la privada cubo: obras
  4. creé una distribución privada y el contacto lo mismo que # 3 - ahora tengo acceso denegado : esperado

Me está costando mucho tiempo generar una URL que funcione. He estado tratando de seguir las instrucciones descritas aquí: http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?PrivateContent.html

Esto es lo que tengo hasta ahora ... no funciona sin embargo - que todavía consigue acceso denegado:

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) 

Puede alguien decir ¿Qué estoy haciendo mal aquí?

Respuesta

11

Todo,

acabo de crear una pequeña joya que se puede utilizar para acceder a URL CF con Rubí utilizando una parte del código de esta pregunta: ¿

https://github.com/stlondemand/aws_cf_signer

probablemente voy a estar haciendo cambios significativos en que en las próximas semanas, ya que tr y para usarlo realmente en mi aplicación, pero quería que todos lo sepan ya que están enumerados en la sección de atribuciones. :)

¡Gracias!

1

Sí, dejando la política como policy = policy_for_resource(resource, expires) trabajó para mí.

1

I bifurcado right_aws (que no han respondido a mi solicitud de extracción) ... He definido CloudFront transmisión en privado y descargas en su biblioteca ACF: http://github.com/wiseleyb/right_aws

1

Estoy de acuerdo con Dylan. Hizo un buen trabajo con la firma de urls. Tuve el mismo problema. Revisé los documentos. Hay una cosa que no encontré allí. Cuando se crea una distribución privada, generalmente se da acceso a los archivos, el depósito, etc. ...

Recibí errores de acceso denegado hasta que asigné la Política de depósito.

Puede asignar la política como:

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