7

歴史:

  1. Amazon でキーと pem ファイルを作成しました。
  2. プライベート バケットを作成しました
  3. パブリック ディストリビューションを作成し、オリジン ID を使用してプライベート バケットに接続しました。
  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)

ここで私が間違っていることを誰かに教えてもらえますか?

4

6 に答える 6

11

全て、

この質問のコードの一部を使用して、Ruby で CF URL に署名するために使用できる小さな gem を作成しました。

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

right_awsをフォークしました(プルリクエストに応答していません)...クラウドフロントのプライベートストリーミングとダウンロードをacfライブラリに設定しました:http: //github.com/wiseleyb/right_aws

于 2010-05-18T16:49:14.290 に答える
1

私はディランに同意します。彼は URL に署名することで良い仕事をしました。同じ問題がありました。私はドキュメントを調べました。私がそこで見つけられなかったことが1つあります。プライベート ディストリビューションを作成するときは、通常、ファイル、バケットなどへのアクセスを許可します...

バケット ポリシーを割り当てるまで、Access Denied エラーが発生しました。

次のようなポリシーを割り当てることができます。

{
    "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

うん、ポリシーをそのままにしておくとpolicy = policy_for_resource(resource, expires)うまくいきました。

于 2010-04-28T13:46:47.693 に答える