- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
感谢您的关注。
我正在尝试编写自己的轻量级 PHP 类来生成 AWS 身份验证 header 。据我所知,它运行正常。我已经使用此处 AWS 文档中提供的示例测试了它的输出:http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html
并且我的代码准确地生成了每个示例给出的输出,因此我非常有信心签名生成是正确的。
我还使用 AWS PHP SDK 测试了 key 和 secret ,并证明它适用于此代码:( key 显然被混淆了:))
require 'vendor/autoload.php';
use Aws\S3\S3Client;
$client = S3Client::factory(array(
'key' => 'xxxxxxxxxxxxxxxxxxxx',
'secret' => 'ssssssssssssssssssssssssssssssssssssssss',
'scheme' => 'http'
));
$result = $client->listBuckets();
foreach ($result['Buckets'] as $bucket) {
// Each Bucket value will contain a Name and CreationDate
echo "{$bucket['Name']} - {$bucket['CreationDate']}\n";
}
(只是测试所以 key 写在代码中,我知道这不是正确的最佳实践:),然后切换到 HTTP,这样我就可以用 wireshark 检查输出)
wireshark 输出显示 SDK 中包含的 header 与我之前链接的文档中提供的 header 不匹配! AWS 文档站点上似乎有很多相互矛盾的文档。
由于我的签名生成代码与示例相符,所以我怀疑是不是我在使用curl发送请求时出错了?我已经尝试将 POST 和 GET 作为响应没有差异的方法。错误消息中的要签名的字符串和规范请求都与签名函数生成的相匹配。
我的代码片段是:
printf("URL: $e\n");
if ($ch = curl_init("http://s3-eu-west-1.amazonaws.com".$e)){ // Create curl request object
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$curlHeaders = array();
foreach ($awsobj->headers as $key => $val){
$curlHeaders[] = $key.': '.$val;
}
$curlHeaders[] = 'Authorization: '.$ah['Authorization'];
curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeaders);
printf("CREQ:\n%s\n---", $awsobj->getCREQ());
printf("STS:\n%s\n---", $awsobj->getSTS());
$res = curl_exec($ch);
var_dump($res);
}
它调用的 URL 是:http://s3-eu-west-1.amazonaws.com/?LocationConstraint=eu-west-1
要签名的字符串:
AWS4-HMAC-SHA256
Sun, 29 Nov 2015 10:57:02 +0000
20151129/eu-west-1/s3/aws4_request
2b1435293edc751d0d80efc9016433a2635de23bc8c0d2e97d3a54c0cfadd74b
规范请求:
GET
/
LocationConstraint=eu-west-1
date:Sun, 29 Nov 2015 10:57:02 +0000
host:s3-eu-west-1.amazonaws.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
date;host;x-amz-content-sha256
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
(这些最后没有return)
S3 的响应是:
<Error><Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<StringToSign>AWS4-HMAC-SHA256
Sun, 29 Nov 2015 10:57:02 +0000
20151129/eu-west-1/s3/aws4_request
2b1435293edc751d0d80efc9016433a2635de23bc8c0d2e97d3a54c0cfadd74b</StringToSign>
<StringToSignBytes>41 57 53 34 2d 48 4d 41 43 2d 53 48 41 32 35 36 0a 53 75 6e 2c 20 32 39 20 4e 6f 76 20 32 30 31 35 20 31 30 3a 35 37 3a 30 32 20 2b 30 30 30 30 0a 32 30 31 35 31 31 32 39 2f 65 75 2d 77 65 73 74 2d 31 2f 73 33 2f 61 77 73 34 5f 72 65 71 75 65 73 74 0a 32 62 31 34 33 35 32 39 33 65 64 63 37 35 31 64 30 64 38 30 65 66 63 39 30 31 36 34 33 33 61 32 36 33 35 64 65 32 33 62 63 38 63 30 64 32 65 39 37 64 33 61 35 34 63 30 63 66 61 64 64 37 34 62</StringToSignBytes>
<CanonicalRequest>GET
/
LocationConstraint=eu-west-1
date:Sun, 29 Nov 2015 10:57:02 +0000
host:s3-eu-west-1.amazonaws.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
date;host;x-amz-content-sha256
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</CanonicalRequest>
<CanonicalRequestBytes>47 45 54 0a 2f 0a 4c 6f 63 61 74 69 6f 6e 43 6f 6e 73 74 72 61 69 6e 74 3d 65 75 2d 77 65 73 74 2d 31 0a 64 61 74 65 3a 53 75 6e 2c 20 32 39 20 4e 6f 76 20 32 30 31 35 20 31 30 3a 35 37 3a 30 32 20 2b 30 30 30 30 0a 68 6f 73 74 3a 73 33 2d 65 75 2d 77 65 73 74 2d 31 2e 61 6d 61 7a 6f 6e 61 77 73 2e 63 6f 6d 0a 78 2d 61 6d 7a 2d 63 6f 6e 74 65 6e 74 2d 73 68 61 32 35 36 3a 65 33 62 30 63 34 34 32 39 38 66 63 31 63 31 34 39 61 66 62 66 34 63 38 39 39 36 66 62 39 32 34 32 37 61 65 34 31 65 34 36 34 39 62 39 33 34 63 61 34 39 35 39 39 31 62 37 38 35 32 62 38 35 35 0a 0a 64 61 74 65 3b 68 6f 73 74 3b 78 2d 61 6d 7a 2d 63 6f 6e 74 65 6e 74 2d 73 68 61 32 35 36 0a 65 33 62 30 63 34 34 32 39 38 66 63 31 63 31 34 39 61 66 62 66 34 63 38 39 39 36 66 62 39 32 34 32 37 61 65 34 31 65 34 36 34 39 62 39 33 34 63 61 34 39 35 39 39 31 62 37 38 35 32 62 38 35 35</CanonicalRequestBytes>
<RequestId>6C049EA89D65D27E</RequestId>
<HostId>HSGO1Iz6LIT5jkHHGM/XCI0ElnSDiQseb1CUcg4RxXjb+xplWoVCFbgJoT6CPvpCsoOSIS7m7VI=</HostId>
(删除访问 key )
过去几天我一直在谷歌搜索和调整我的代码。我无法发现签名生成有任何问题,因为您可以看到我生成的 STS 和 CREQ 都与 S3 生成的相匹配。我的代码通过并匹配上面链接中的所有示例,包括身份验证 header 凭据。
我怀疑我是
根据 Rhythmic Fistman 的建议,我也尝试用 x-amz-date header 替换 Date header ,但这并没有解决问题。我的新标题的格式是:
x-amz-date:20151130T143334Z
创建于 2015 年 11 月 30 日 14:33
谢谢
最佳答案
我发现了我的错误:/这与 curl 无关,而是与我处理签名的方式有关。
我一直在通过测试流程每个阶段的输出并将结果与亚马逊示例给出的结果进行比较来测试我的代码。这些都通过了,所以我确定我的代码是正确的。
但是,要签名的字符串的生成需要规范请求的哈希。在我的代码中,我有一个生成规范请求并输出它的函数,但它也会生成它的散列并将其存储在对象的公共(public)变量中。我的要签名的字符串生成函数在要签名的字符串的生成中使用此变量。
现在,由于我的测试代码调用了规范请求,测试了它的输出是有效的,然后调用了字符串进行签名并测试了它的结果是有效的,它无意中导致了哈希的创建。
在我调用 API 的实际代码中,不需要输出实际的规范请求,因此从未创建哈希并且要签名的字符串无效。在生成签名后,我在尝试诊断问题时添加的输出被添加到代码的末尾。
意识到我的错误后,我刚刚将输出规范请求的调用移到生成签名的调用之前,嘿,它很快就起作用了!
啊!
我认为最好在这里解释我的方法错误,我承认这是我自己的愚蠢错误,如果编写代码能够查看流程的各个阶段,请确保它们不依赖于这些阶段,或者调用曝光方法以正常运行。
关于php - AWS SignatureDoesNotMatch 错误但签名代码和 key 对似乎都有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33982221/
我遇到了一个奇怪的问题。我有这个: $(document).ready(function () {
我正在编写一个程序,它从列表中读取一些 ID,从中找出不同的 URL,然后将图像保存到我的 C: 驱动器中。 如果我在浏览器中导航到图像 URL,它们就会起作用。此外,如果我尝试从不同的服务器获取图像
我编写了一个 REST WCF RIA Silverlight 4.0 兼容服务,我可以从 javascript + jQuery.1.4.2.js + JSON2.js(当然,还可以从 .NET 4
我很确定这个网站实际上还没有得到回答。一劳永逸地,与 32 位有符号整数范围内的数字字符串匹配的最小正则表达式是什么,范围是 -2147483648至 2147483647 . 我必须使用正则表达式进
我有两个data.table;我想从那些与键匹配的元素中随机分配一个元素。我现在这样做的方式相当慢。 让我们具体点;这是一些示例数据: dt1<-data.table(id=sample(letter
我已经安装了 celery 、RabitMQ 和花。我可以浏览到花港。我有以下简单的工作人员,我可以将其附加到 celery 并从 python 程序调用: # -*- coding: utf-8 -
我正在使用 ScalaCheck 在 ScalaTest 中进行一些基于属性的测试。假设我想测试一个函数,f(x: Double): Double仅针对 x >= 0.0 定义的, 并返回 NaN对于
我想检查文件是否具有有效的 IMAGE_DOS_SIGNATURE (MZ) function isMZ(FileName : String) : boolean; var Signature: W
在 Herbert Schildt 的“Java:完整引用,第 9 版”中,有一个让我有点困惑的例子。它的关键点我无法理解可以概括为以下代码: class Test { public stat
我在工作中查看了一些代码,发现了一些我以前没有遇到过的东西: for (; ;) { // Some code here break; } 我们一直调用包含这个的函数,我最近才进去看看它是
在 Herbert Schildt 的“Java:完整引用,第 9 版”中,有一个让我有点困惑的例子。它的关键点我无法理解可以概括为以下代码: class Test { public stat
我试图编写一个函数,获取 2D 点矩阵和概率 p 并以概率 p 更改或交换每个点坐标 所以我问了一个question我试图使用二进制序列作为特定矩阵 swap_matrix=[[0,1],[1,0]]
这个问题在这里已经有了答案: Using / or \\ for folder paths in C# (5 个答案) 关闭 7 年前。 我在某个Class1中有这个功能: public v
PostgreSQL 10.4 我有一张 table : Column | Type ------------------------- id | integer| title
我正在 Postgresql 中编写一个函数,它将返回一些针对特定时区(输入)计算的指标。 示例结果: 主要问题是这只是一个指标。我需要从其他表中获取其他 9 个指标。 对于实现此目标的更简洁的方法有
我需要在 python 中模拟超几何分布(用于不替换采样元素的花哨词)。 设置:有一个装满人口许多弹珠的袋子。弹珠有两种类型,红色和绿色(在以下实现中,弹珠表示为 True 和 False)。从袋子中
我正在使用 MaterializeCSS 框架并动态填充文本输入。我遇到的一个问题是,在我关注该字段之前,valid 和 invalid css 类不会添加到我的字段中。 即使我调用 M.update
是否有重叠 2 个 div 的有效方法。 我有以下内容,但无法让它们重叠。 #top-border{width:100%; height:60px; background:url(image.jpg)
我希望你们中的一位能向我解释为什么编译器要求我在编译单元中重新定义一个静态固定长度数组,尽管我已经在头文件中这样做了。这是一个例子: 我的类.h: #ifndef MYCLASS_H #define
我正在使用旧线程发布试图解决相同问题的新代码。什么是安全 pickle ? this? socks .py from socket import socket from socket import A
我是一名优秀的程序员,十分优秀!