2017-03-06 5 views
0

署名に必要なものを見つけようとしています。私は16進数を使ったいくつかの例と、base64を使った例を見ています。どちらですか?s3署名の計算方法

Base64.encode64(OpenSSL::HMAC.digest('sha256', getSignatureKey, @policy)).gsub(/\n|\r/, '')

または:

OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), getSignatureKey, @policy).gsub(/\n|\r/, '')

+0

それはあなたが使用している署名Bersionに依存します。一般的なバージョンはV2(base64)とV4(hex)です。実装しようとしていることについては、ドキュメントにリンクしてください。おそらくこれを明確にすることができます。 –

+0

Ahh okay私はs3への投稿でv4をやっています –

答えて

0

わかりましたので、私はそれを得ました。署名を作成する際に考慮すべき2つの非常に重要なことがあります。 A)署名の計算方法、およびB)バケットポリシーの設定方法。あなたのCORSが投稿を許可するように設定されていて、あなたのIAMユーザ/グループがs3アクセス権を持っていると仮定しています。実際にはs3アクセスのみが必要です。

フォームデータのためのバケットポリシーが必要です。 ["starts-with", "$key", "{{intended_file_path}}"]"x-amz-credential""x-amz-algorithm""x-amz-date""bucket"

["starts-with", "$key"意図したファイルの保存先のパスでなければなりません - すなわち、 "アップロード"、または「ユーザーを/ jack/"、または" images "、何でも - 以下の例を参照してください。

私の署名とバケットポリシーに署名した方法は次のとおりです。

バケツ設定:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "Allow Get", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::example-development/*" 
     }, 
     { 
      "Sid": "AddPerm", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "arn:aws:iam::123456789:user/example" 
      }, 
      "Action": "s3:*", 
      "Resource": ["arn:aws:s3:::example-development/*","arn:aws:s3:::example-development"] 
     } 
    ] 
} 

は、バックエンド:

def string_to_sign 

    @time = Time.now.utc 
    @time_policy = @time.strftime('%Y%m%dT000000Z') 
    @date_stamp = @time.strftime('%Y%m%d') 

    ret = {"expiration" => 10.hours.from_now.utc.iso8601, 
      "conditions" => [ 
       {"bucket" => ENV["aws_bucket"]}, 
       {"x-amz-credential": "#{ENV["aws_access_key"]}/#{@date_stamp}/us-west-2/s3/aws4_request"}, 
       {"x-amz-algorithm": "AWS4-HMAC-SHA256"}, 
       { "acl": "public-read" }, 
       {"x-amz-date": @time_policy }, 
       ["starts-with", "$key", "uploads"], 
      ] 
      } 
    @policy = Base64.encode64(ret.to_json).gsub(/\n|\r/, '') 

end 

def getSignatureKey 
     kDate = OpenSSL::HMAC.digest('sha256', ("AWS4" + ENV["aws_secret_key"]), @date_stamp) 
     kRegion = OpenSSL::HMAC.digest('sha256', kDate, 'us-west-2') 
     kService = OpenSSL::HMAC.digest('sha256', kRegion, 's3') 
     kSigning = OpenSSL::HMAC.digest('sha256', kService, "aws4_request") 
    end 

def sig 
     sig = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), getSignatureKey, @policy).gsub(/\n|\r/, '') 
end