Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php AWS SignatureDesNotMatch错误,但签名代码似乎和密钥对一样有效_Php_Amazon Web Services_Curl_Amazon S3 - Fatal编程技术网

Php AWS SignatureDesNotMatch错误,但签名代码似乎和密钥对一样有效

Php AWS SignatureDesNotMatch错误,但签名代码似乎和密钥对一样有效,php,amazon-web-services,curl,amazon-s3,Php,Amazon Web Services,Curl,Amazon S3,谢谢你的关注 我正在尝试编写自己的轻量级PHP类来生成AWS身份验证头。据我所知,它运行正常。我已经使用AWS文档中提供的示例测试了它的输出: 我的代码精确地生成了每个示例的输出,因此我确信签名生成是正确的 我还使用AWS PHP SDK测试了密钥和密码,并证明它可以与以下代码一起工作:(密钥明显模糊:) (只是测试,以便在代码中写入密钥,我知道这不是正确的最佳实践:),然后切换到HTTP,以便我可以使用wireshark检查输出) wireshark输出显示SDK中包含的头文件与我之前链接的文

谢谢你的关注

我正在尝试编写自己的轻量级PHP类来生成AWS身份验证头。据我所知,它运行正常。我已经使用AWS文档中提供的示例测试了它的输出:

我的代码精确地生成了每个示例的输出,因此我确信签名生成是正确的

我还使用AWS PHP SDK测试了密钥和密码,并证明它可以与以下代码一起工作:(密钥明显模糊:)

(只是测试,以便在代码中写入密钥,我知道这不是正确的最佳实践:),然后切换到HTTP,以便我可以使用wireshark检查输出)

wireshark输出显示SDK中包含的头文件与我之前链接的文档中提供的头文件不匹配!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是:

用字符串来表示:

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
(在这些报告的末尾没有返回)

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>
(删除的访问密钥)

过去几天我一直在谷歌上搜索和调整我的代码。我无法发现签名生成的任何错误,因为您可以看到我生成的STS和CREQ都与S3生成的匹配。我的代码通过并匹配上面链接上的所有示例,包括身份验证头凭据

我想我是

  • 要么缺少S3希望我包含的内容(必需的标题,我已经搜索了这些内容,但没有找到任何内容,无论有无LocationConstraint,输出都是相同的,并且如果我将其指向us-east-1)
  • 弄乱卷曲一些怎么样
  • 使用了错误的身份验证头(正如我所说的,SDK生成的请求看起来完全不同,但也不符合文档所说的要求)
根据Rhythmic Fistman的建议,我也尝试用x-amz-Date标题替换日期标题,但这并没有解决问题。我的新标题的格式是:

x-amz-date:20151130T143334Z
创建于2015年11月30日14:33


谢谢

我突然想到两件事:

  • 您没有添加
    x-amz-date
    标题
  • 要签名的字符串中的日期格式似乎错误。它应该是
    ISO-8601
    (例如20130524000000Z)

  • 有一个问题。确保您的实现与测试中的输出相匹配

    我发现了我的错误:/这与curl无关,而是与我如何接近签名有关

    我一直在测试我的代码,方法是在流程的每个阶段测试输出,并将结果与Amazon示例给出的结果进行比较。这些都通过了,所以我确信我的代码是正确的

    但是,生成要签名的字符串需要对规范请求进行哈希。在我的代码中,我有一个生成规范请求并输出它的函数,但它也会生成它的散列并将其存储在对象中的公共变量中。My string to sign生成函数在生成要签名的字符串时使用此变量

    现在,当我的测试代码调用canonical请求,测试它的输出是否有效,然后调用字符串进行签名并测试它的结果是否有效时,它无意中导致创建了散列

    在我调用API的实际代码中,不需要输出实际的规范请求,因此从未创建哈希,要签名的字符串无效。我在尝试诊断问题时添加的输出是在生成签名后,在代码末尾添加的

    在意识到我的错误后,我刚刚移动了调用以在调用生成签名之前输出规范化请求,嘿,请注意它可以工作


    我认为最好在这里解释一下我的错误,我承认这是我自己愚蠢的错误,如果编写代码以便能够查看流程的各个阶段,请确保它们不依赖于这些阶段,也不依赖于调用的暴露方法来正常工作。

    根据AWS API文档,必须提供日期头或x-amz-date,如果提供了x-amz日期,则应以该日期为准。我已经重复了我的测试,但是这次添加了x-amz-date头而不是date,得到了完全相同的响应(明显不同的哈希:)。我仍然得到完全相同的错误消息。可以,但我需要再等15个小时,所以让我:)(我在最初发布它时尝试过)。。可能是因为我的帐户是新的?
    x-amz-date:20151130T143334Z