预签名网址

时间:2016-07-07 12:21:30

标签: perl amazon-web-services amazon-s3

我正在尝试为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"

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

1 个答案:

答案 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";