当前位置: 首页 > 知识库问答 >
问题:

PHP AMAZON API网关:我们计算的请求签名与您提供的签名不匹配

季骏祥
2023-03-14

我想从网站content.geappliances.io使用AWS API网关得到响应,但总是得到错误:

{“信息”:"我们计算的请求签名与您提供的签名不匹配。请检查您的AWS秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。\n\n此请求的规范字符串应为\n'GET\n/search/b2b/results\n\n内容类型:\n host:content.geapplications.io\nx amz日期:20170401T041050Z\n\nt-type;host;x-amz-date\NE3B0C44298FC1C149AFBF4C8996FB927AE41E4649B934CA495991B7852B855'\n\n要签名的字符串应该是\n'AWS4-HMAC-SHA256\n20170401401041050Z\n20170401/us-east-1/执行api/AWS4请求\na8AEC682C0F9A2471BD17FAA5CE5CD810A16F129FCA9B04347CEED54FDC61'}

请有人帮帮我,我的代码怎么了。代码如下:

function signRequest(){

    $method ='GET';
    $uri = '/search/b2b/results?N=0&Ntk=SKU&Ntt=GTX33EASKWW';

    $access_key         = 'my-access-key';
    $secretKey          = 'my-secret-key';
    $region             = 'us-east-1';
    $kService           = 'execute-api';
    $service            = 'execute-api';

    $options = array(); 
    $headers = array();
    $host    = "content.geappliances.io";
    $alg = 'sha256';

    $date = new DateTime( 'UTC' );

    $dd = $date->format( 'Ymd\THis\Z' );

    $amzdate2 = new DateTime( 'UTC' );
    $amzdate2 = $amzdate2->format( 'Ymd' );
    $amzdate = $dd;

    $algorithm = 'AWS4-HMAC-SHA256';

    $requestPayload = "UNSIGNED_PAYLOAD";
    $hashedPayload = hash($alg, $requestPayload);

    $canonical_uri = $uri;
    $canonical_querystring = '';

    $canonical_headers = "content-type:"."application/json"."\n"."host:".$host."\n"."x-amz-date:".$amzdate."\n";
    $signed_headers = 'content-type;host;x-amz-date';
    $canonical_request = "".$method."\n".$canonical_uri."\n".$canonical_querystring."\n".$canonical_headers."\n".$signed_headers."\n".$hashedPayload;

    $credential_scope = $amzdate2 . '/' . $region . '/' . $service . '/' . 'aws4_request';
    $string_to_sign  = "".$algorithm."\n".$amzdate ."\n".$credential_scope."\n".hash('sha256', $canonical_request)."";

    $kSecret = 'AWS4' . $secretKey;
    $kDate = hash_hmac( $alg, $amzdate2, $kSecret, true );
    $kRegion = hash_hmac( $alg, $region, $kDate, true );
    $kService = hash_hmac( $alg, $service, $kRegion, true );
    $kSigning = hash_hmac( $alg, 'aws4_request', $kService, true );     
    $signature = hash_hmac( $alg, $string_to_sign, $kSigning ); 
    $authorization_header = $algorithm . ' ' . 'Credential=' . $access_key . '/' . $credential_scope . ', ' .  'SignedHeaders=' . $signed_headers . ', ' . 'Signature=' . $signature;

    $headers = array(
                'content-typeapplication/json', 
                "cache-control: no-cache",
                "host: content.geappliances.io",
                'x-amz-date: '.$amzdate.'', 
                'Authorization: '.$authorization_header.''
            );
    return $headers;

}

$curl = curl_init();

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://content.geappliances.io/search/b2b/results?N=0&Ntk=SKU&Ntt=GTX33EASKWW",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => signRequest(),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}    

在《邮递员》中,我生成了我的访问密钥和秘密密钥,然后它工作得很好。

邮差成绩

共有1个答案

易炳
2023-03-14

看看你的代码

$access_key         = 'my-access-key';
$secretKey          = 'my-secret-key';

您必须在此处输入访问密钥和密钥的值。我想是亚马逊提供给你的吧?

因为你的错误信息说

我们计算的请求签名与您提供的签名不匹配。检查您的AWS秘密访问密钥和签名方法

 类似资料:
  • 我正试图上传一张使用AWS S3 SDK的图片。现在,这以前是有效的,但由于某种原因,它停止了工作,我开始得到这个错误: 现在,当我点击链接时,它会给我一个'NoSuchKey'错误: 我真的不明白这一点,因为我的键实际上只是一个字符串。我也试图上传一些东西,所以显然关键不会存在-我正在努力上传它! 另一个教程来自一个博客,我没有它的链接,但我上面的代码与文档中的这个教程相同。我所做的只是把它移到

  • 我有不同的对象来生成保存在S3中的文件。每个对象调用以下函数来保存文件。 我只有以下几个问题。对象要么总是保存文件,要么永远无法保存文件。 错误是 我们计算的请求签名与您提供的签名不匹配。检查您的AWS秘密访问密钥和签名方法。有关详细信息,请参阅REST身份验证和SOAP身份验证。(服务:S3,状态代码:403,请求ID:79b6c0a2-0d74-1f30-a4bf-246e9631ccd8,扩

  • 我试图按照教程HTTP://docs.aws.amazon.com/amazons3/latest/api/sigv4-post-example.html使用HTTP post方法将图像上传到s3 bucket。但我每次都得到以下错误 政策如下: 生成策略和签名的代码将粘贴到相关的表单字段中:

  • 我试图上传图片到s3与预先签署的url从aws SDK生成。 对于上面的返回url,当我试图访问它时,它给出了一个错误 null CORS配置 更新的解决方案

  • 我正试图在iOS上执行AWS上传。我正在遍历一个对象数组,并将大量大小不同的图像(1000+)上传到S3 bucket中。使用: 当我到达大约第700张图像时,上传过程开始变得非常缓慢,然后我开始在随后的每一次图像上传中收到这些错误: 编辑2:每个Yosuke请求的代码(我只是构建了一个请求对象数组,然后循环遍历数组并上传每个请求):

  • 我试图使用获取S3 bucket中的对象列表。获取以下异常: 我的代码片段: https://stackoverflow.com/a/30519762/948268--提到键以句点开始。 https://github.com/aws/aws-sdk-js/issues/86--讨论如何确保URI查询字符串参数值的正确编码。但在我的例子中,我使用的是AwsSessionCredentials类。 还