2016-07-07 15 views
1

Amazon S3用に事前に署名されたURLを作成しようとしています。予約済みURLのS3シグネチャの不一致

以下のコードは、S3ドキュメントの例の署名と同じ署名を生成します。 (https://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html

私は自分の資格情報などをプラグインするときしかし、私は、AWSからエラーを取得: 「我々は計算要求署名は、あなたが提供する署名と一致していませんあなたの鍵と署名の方法を確認してください。」

以下のコードがうまくいくように見える場合、私の署名方法はOKであると推測します。また、使用される資格情報は、ファイルをアップロードするために使用されるもの です。それらはルート証明書であり、IAMユーザーではありません。

私が試してみました:

1)とし、期間なしのファイル名。 2)アメリカ標準とアイルランドのファイル。 3)HTTPとHTTPS 4)SHA256(これはドキュメント内の例を分けていますが) 5)異なるWebクライアント:wget、curl、Firefox。

私はここで指定したPHPとまったく同じことをやっているように見える: Creating a signed S3 URL with Javascript

これは、米国の標準のために生成されたURLです。バケットは、ファイルには、 "foo.txtの" だから

https://s3.amazonaws.com/buck1bar/foo.txt?AWSAccessKeyId=AKIAJG5VR56AB5USIG5Q&Expires=1467893299&Signature=emdimX%2FWKYrcdhtPtE7eQ9ErWv30HNlAHaa9vlDODCY%3D

は、 "buck1bar" ですが、私は間違って何をやっていますか?

#!/usr/bin/perl 

use strict; 
use warnings; 
use diagnostics; 

use MIME::Base64; 

use Digest::HMAC; 
use Digest::SHA; 
use URI::Escape; 


my $hmac3 = Digest::HMAC->new('OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV', 'Digest::SHA'); 

$hmac3->add("GET\n\n\n1141889120\n/quotes/nelson"); 

my $signature = uri_escape(encode_base64 $hmac3->digest, ''); 

print "vjbyPxybdZaNmGa%2ByT272YEAiv4%3D\n$signature\n"; 

# vjbyPxybdZaNmGa%2ByT272YEAiv4%3D 
# vjbyPxybdZaNmGa%2ByT272YEAiv4%3D 
+0

今すぐAWSにログインし、この質問に投稿した認証情報を無効にしてください。公共の場所に資格情報を掲載しないでください。誰かがあなたの信任状を不正に使用すると、あなたは潜在的に重大な責任を負うことになります。 –

+0

質問の2行目:「以下のコードは、S3ドキュメントの例の署名と同じ署名を生成します。 – ftumsh

+0

ハハハ私の悪い。 *「以下のコードがうまくいくように思えば、私の署名方法は大丈夫だと思われます。また、ファイルのアップロードに使用されている資格情報もあります。 IAMユーザーではなく、ルート資格情報です。 "* Sweet:以下のコードは、ルート資格情報を含んでいます。 –

答えて

0

さらにハッカーの後、私が使っていたモジュールが既にそれをしていることが分かります。

my $client = Net::Amazon::S3::Client->new(s3 => $s3); 

my $bucket = $client->bucket(name => $bucket_name); 

my $o = $bucket->object(key => 'key1', expires => '2016-07-08'); 
my $uri = $o->query_string_authentication_uri(); 

print "$uri\n"; 
関連する問題