我正试图为亚马逊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“
那我做错什么了?
#!/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发布于 2016-07-07 19:28:16
经过进一步的黑客攻击,原来我使用的模块已经开始使用了。
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";https://stackoverflow.com/questions/38245351
复制相似问题