2016-07-07 52 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"; 
相关问题