Pergunta

História:

  1. Eu criei um arquivo de chave e PEM na Amazon.
  2. Eu criei um balde privado
  3. Criei uma distribuição pública e usei o ID de origem para me conectar ao balde privado: obras
  4. Criei uma distribuição privada e a conectei da mesma forma que o #3 - agora tenho acesso negado: esperado

Estou tendo muita dificuldade em gerar um URL que funcionará. Eu tenho tentado seguir as instruções descritas aqui: http://docs.amazonwebservices.com/amazonCloudfront/latest/developerguide/index.html?privatecontent.html

É isso que eu tenho até agora ... não funciona - ainda assim, obtendo acesso negado:

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)

Alguém pode me dizer o que estou fazendo de errado aqui?

Foi útil?

Solução

Tudo,

Acabei de criar uma pequena jóia que pode ser usada para assinar URLs de CF com Ruby usando parte do código desta pergunta:

https://github.com/stlondemand/aws_cf_signer

Provavelmente farei alterações significativas nas próximas semanas, enquanto tento realmente usá -lo no meu aplicativo, mas queria que todos saibam como você está listado na seção Atribuições. :)

Obrigada!

Outras dicas

Remova URL_SAFE Antes de definir Política: Política = Policy_for_Resource (Recurso, expira)

De acordo com os documentos, apenas base64 deve ser seguro para URL (m) = Charreplace (base64 (m), "+=/", "-_ ~")

.. e verifique se o CloudFront está configurado corretamente como:http://blog.cloudberrylab.com/2010/03/how-to-configure-private-content-for.html

Sim, deixando a política como policy = policy_for_resource(resource, expires) trabalhou para mim.

Eu biforeei Right_AWS (eles não responderam à minha solicitação de tração) ... Configurei o streaming privado do CloudFront e o download na biblioteca ACF: http://github.com/wiseleyb/right_aws

Eu concordo com Dylan. Ele fez um bom trabalho com a assinatura de URLs. Eu tive o mesmo problema. Eu passei pelos documentos. Há uma coisa que eu não encontrei lá. Quando você cria uma distribuição privada, geralmente dá acesso a arquivos, balde, etc ...

Recebi erros negados até que eu atribuísse política de balde.

Você pode atribuir políticas 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/*"
        }
    ]
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top