2016-07-07 121 views
1

我正在嘗試爲Amazon S3創建預先簽名的URL。S3簽名不匹配對於預先設置的URL

以下代碼與S3文檔中的示例中的簽名生成相同的簽名。 (https://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html

然而,當我插上我自己的憑據等等,我得到一個錯誤的AWS: 「我們出的要求籤名不匹配您提供的簽名檢查密鑰和簽名方法。」

鑑於下面的代碼似乎工作,我認爲我的簽名方法是好的。此外,使用的憑證是 用於上載文件,因此它們也很好。它們是根證書,而不是IAM用戶。

我試過了:

1)有和沒有句點的文件名。 2)美國標準文件以及愛爾蘭文件。 3)HTTP和HTTPS 4)SHA256(儘管這打破了文檔中的例子) 5)不同的Web客戶端:wget,curl和Firefox。

我似乎在做完全一樣,這裏給出的PHP: Creating a signed S3 URL with Javascript

這是美國標準生成的URL。鬥是 「buck1bar」,文件是 「foo.txt的」

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

那麼,我究竟做錯了什麼?

#!/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

問題的第二行:「下面的代碼與S3文檔中的示例中的簽名生成相同的簽名。」 – ftumsh

+0

哈哈哈我不好。現在,這是我的頭爆炸的地方:*「鑑於下面的代碼似乎工作,我認爲我的簽名方法是可以的。另外,使用的憑證是用於上載文件的憑證,所以它們也很好。是根證書,而不是IAM用戶。「* Sweet:下面的代碼包含您的根證書。 –

回答

0

經過進一步的hackery,事實證明,我使用的模塊已經做到了。

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"; 
相關問題