我们计算的请求签名与您提供的签名不匹配.- AWS 中的错误


The request signature we calculated does not match the signature you provided. - Error in AWS

我有以下代码:

$method = "GET";
$host = "payments-sandbox.amazon.com";
$uri = "/cba/api/purchasecontract/";
$private_key='PRIVATE_KEY';
$time = date('c');
$params = array(
    'AWSAccessKeyId' => $private_key,
    'Action' => "CreatePurchaseContract",
    'SignatureMethod' => "HmacSHA256",
    'SignatureVersion' => "2",
    'Timestamp' => $time);
uksort($params, 'strcmp');
$canonicalized_query = array();
foreach ($params as $param => $value) {
    $param = str_replace("%7E", "~", rawurlencode($param));
    $value = str_replace("%7E", "~", rawurlencode($value));
    $canonicalized_query[] = $param . "=" . $value;
}
$canonicalized_query = implode("&", $canonicalized_query);
$string_to_sign = $method . "'n" . $host . "'n" . $uri . "'n" . $canonicalized_query;
$signature = base64_encode(hash_hmac("sha256", $string_to_sign, $private_key, True));
$signature = str_replace("%7E", "~", rawurlencode($signature));
echo $url = "https://payments-sandbox.amazon.com/cba/api/purchasecontract/"
 . "?Action=CreatePurchaseContract"
 . "&SignatureMethod=HmacSHA256"
 . "&AWSAccessKeyId=$private_key"
 . "&Signature=".$signature
 . "&SignatureVersion=2"
 . "&Timestamp=" . $time;

但是当我在新选项卡中打开 url 时,它会返回以下 XML:

<ErrorResponse>
    <Error>
        <Type>Sender</Type>
        <Code>SignatureDoesNotMatch</Code>
        <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message>
    </Error>
    <RequestId>01a5de72-6e3f-11e4-85b3-9119f1b849cd</RequestId>
</ErrorResponse>

并且在新选项卡中打开$url链接时会给出The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.错误消息。

我不知道创建签名有什么问题??

[更新]

我尝试cUrl获取数据:

$ch = curl_init();
$options = array(CURLOPT_URL => $url);
curl_setopt_array($ch, $options);
$data = curl_exec($ch);
if(!$data){
    die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch));
}
curl_close($ch);
print_r($data);

但它给了我Error: "SSL certificate problem: unable to get local issuer certificate" - Code: 60.那么我怎么做才能从payments-sandbox.amazon.com中获取数据

当我尝试使用 EB CLIx3 中的 eb init 命令添加凭据时,我遇到了同样的错误。

事实证明,我每次都输入错误的凭据。我切换到Windows控制台,在那里我可以复制/粘贴我的凭据。现在一切都顺利了。

因此,我的建议是复制/过去的凭据。如果这不起作用,您可能需要为具有管理员权限的用户创建新的访问密钥。您可以在 IAM 部分执行此操作。然后尝试再次复制过去。