Perl 预签名URL的S3签名不匹配

Perl 预签名URL的S3签名不匹配,perl,amazon-web-services,amazon-s3,Perl,Amazon Web Services,Amazon S3,我正在尝试为AmazonS3创建一个预签名URL 下面的代码生成的签名与S3文档中示例中的签名相同。 () 但是,当我插入自己的凭据等时,我从AWS收到一个错误: “我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法。” 鉴于下面的代码似乎有效,我认为我的签名方法是正确的。此外,所使用的凭据是 用于上传文件,所以它们也很好。它们是根凭据,不是IAM用户 我试过: 1) 带句点和不带句点的文件名。 2) 美国标准和爱尔兰标准的文件。 3) HTTP和HTTPS 4) SHA256(尽

我正在尝试为AmazonS3创建一个预签名URL

下面的代码生成的签名与S3文档中示例中的签名相同。 ()

但是,当我插入自己的凭据等时,我从AWS收到一个错误: “我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法。”

鉴于下面的代码似乎有效,我认为我的签名方法是正确的。此外,所使用的凭据是 用于上传文件,所以它们也很好。它们是根凭据,不是IAM用户

我试过:

1) 带句点和不带句点的文件名。 2) 美国标准和爱尔兰标准的文件。 3) HTTP和HTTPS 4) SHA256(尽管这打破了文档中的示例。) 5) 不同的web客户端:wget、curl和Firefox

我似乎在做与这里给出的php完全相同的事情:

这是为美国标准生成的URL。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

经过进一步的黑客攻击,结果证明我使用的模块已经做到了

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

经过进一步的黑客攻击,结果证明我使用的模块已经做到了

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

现在,立即登录AWS并使您在此问题中发布的凭据无效。不要在公共场所张贴您的凭据。如果有人欺诈性地使用您的凭据,您可能会承担重大责任。问题的第二行:“下面的代码生成的签名与S3文档中示例中的签名相同。”哈哈,我的错。现在,我的脑袋在这里代表你爆炸:“鉴于下面的代码似乎有效,我认为我的签名方法是正确的。而且,使用的凭据是用于上载文件的凭据,因此它们也很好。它们是根凭据,而不是IAM用户。”Sweet:下面的代码,包括您的根凭据。lol,我当时正忙于这个想法,我甚至没有意识到这是一个Perl问题。我所看到的S3的每个模块似乎都是由一些人编写的,他们确实没有掌握所有必要的原则,没有正确地处理异常,也没有支持所有需要的边缘案例。我举手写了自己的代码,除了使用其他人的模块编写的代码后来被破坏或需要增强时,我再也没有回头看。呵呵,没问题。我仍然不确定它为什么不起作用。不过现在,如果我真的需要知道的话,我可以在模块里随便看看。感谢您抽出时间。现在,请立即登录AWS并使您在此问题中发布的凭据无效。不要在公共场所张贴您的凭据。如果有人欺诈性地使用您的凭据,您可能会承担重大责任。问题的第二行:“下面的代码生成的签名与S3文档中示例中的签名相同。”哈哈,我的错。现在,我的脑袋在这里代表你爆炸:“鉴于下面的代码似乎有效,我认为我的签名方法是正确的。而且,使用的凭据是用于上载文件的凭据,因此它们也很好。它们是根凭据,而不是IAM用户。”Sweet:下面的代码,包括您的根凭据。lol,我当时正忙于这个想法,我甚至没有意识到这是一个Perl问题。我所看到的S3的每个模块似乎都是由一些人编写的,他们确实没有掌握所有必要的原则,没有正确地处理异常,也没有支持所有需要的边缘案例。我举手写了自己的代码,除了使用其他人的模块编写的代码后来被破坏或需要增强时,我再也没有回头看。呵呵,没问题。我仍然不确定它为什么不起作用。不过现在,如果我真的需要知道的话,我可以在模块里随便看看。谢谢你抽出时间。