7

历史:

  1. 我在亚马逊上创建了一个密钥和 pem 文件。
  2. 我创建了一个私人存储桶
  3. 我创建了一个公共发行版并使用原始 ID 连接到私有存储桶:工作
  4. 我创建了一个私有发行版并将其连接为与#3 相同 - 现在我被拒绝访问:预期

我很难生成一个有效的网址。我一直在尝试遵循此处描述的说明: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)

谁能告诉我我在这里做错了什么?

4

6 回答 6

11

全部,

我刚刚创建了一个小 gem,可用于使用此问题中的一些代码使用 Ruby 对 CF URL 进行签名:

https://github.com/stlondemand/aws_cf_signer

在接下来的几周内,我可能会对其进行重大更改,因为我尝试在我的应用程序中实际使用它,但我想让大家知道,因为您在归因部分中列出。:)

谢谢!

于 2010-11-17T23:17:47.850 回答
2

在设置策略之前删除 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

于 2010-04-23T20:42:25.940 回答
1

是的,让政策policy = policy_for_resource(resource, expires)对我有用。

于 2010-04-28T13:46:47.693 回答
1

我分叉了 right_aws(他们没有回应我的拉取请求)......我在他们的 acf 库中设置了云端私有流和下载:http: //github.com/wiseleyb/right_aws

于 2010-05-18T16:49:14.290 回答
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/*"
        }
    ]
}
于 2010-12-02T08:14:27.723 回答
1

这是一个老问题,但使用 ruby​​ sdk 签署云端 URL 的内容仍然很少,因此添加一些更新的帮助。现在有一个cloudfront sdk可以很容易地做到这一点:

signer = Aws::CloudFront::UrlSigner.new({
  key_pair_id: "my_key_pair_id"
  private_key_path: "./my_secret.pem" ,
  # Or, you can just provide the contents of the pem as string
  private_key = "--- long private key ---"
})

signed_url = signer.signed_url('http://my-cloudfront-domain.com/my/object/path', expires: 3600) 
于 2020-09-11T21:19:17.240 回答