我正在尝试为Amazon S3创建预签名网址。
以下代码生成与S3文档示例中的签名相同的签名。 (https://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html)
但是,当我插入自己的凭据等时,我收到来自AWS的错误: "我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。"
鉴于以下代码似乎有效,我认为我的签名方法没问题。此外,使用的凭证是那些 用来上传文件,所以它们也很好。它们是root凭据,而不是IAM用户。
我试过了:
1)包含和不包含句点的文件名。 2)美国标准以及爱尔兰的文件。 3)HTTP和HTTPS 4)SHA256(虽然这打破了文档中的示例。) 5)不同的Web客户端:wget,curl和Firefox。
我似乎与这里给出的php完全相同: Creating a signed S3 URL with Javascript
这是为美国标准生成的网址。 Bucket是" buck1bar",文件是" foo.txt"
那么,我做错了什么?
#!/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 :(得分: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";