【问题标题】:AWS SignatureDoesNotMatchAWS SignatureDoesNotMatch
【发布时间】:2016-07-14 14:22:15
【问题描述】:

接收:

SignatureDoesNotMatch我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。

以下内容:

String associateTag = "example-20";
String awsAccessKeyId = "accessKeyId";
String awsSecretKey = "secretKey";
String endpoint = "webservices.amazon.com";
String uri = "/onca/xml";
String charset = "UTF8";

private String buildQueryString(String keywords) {
    Map<String,String> params = new ArrayMap<>();
    List<String> pairs = new ArrayList<>();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

    params.put("Service","AWSECommerceService");
    params.put("Operation","ItemSearch");
    params.put("AWSAccessKeyId",awsAccessKeyId);
    params.put("AssociateTag",associateTag);
    params.put("SearchIndex","All");
    params.put("ResponseGroup","Images,ItemAttributes");
    params.put("Timestamp",sdf.format(new Date()));
    params.put("Keywords", keywords);

    Map<String, String> treeMap = new TreeMap<>(params);
    try {
        for (Map.Entry<String, String> param : treeMap.entrySet()) {
            pairs.add(URLEncoder.encode(param.getKey(), charset) + "=" + URLEncoder.encode(param.getValue(), charset));
        }
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    String queryString = "";
    for (int i = 0; i < pairs.size(); i++) {
        if (i != 0) {
            queryString += "&";
        }

        queryString += pairs.get(i);
    }

    Log.d(TAG, "queryString: " + queryString);

    return queryString;
}

private String buildSignature(String queryString) {
    String hash = "";

    try {
        String message = "GET\n" + endpoint + "\n" + uri + "\n" + queryString;
        Log.d(TAG, "message: " + message);

        Mac sha_HMAC = Mac.getInstance("HmacSHA256");

        SecretKeySpec secret_key = new SecretKeySpec(awsSecretKey.getBytes(charset), "HmacSHA256");
        sha_HMAC.init(secret_key);

        hash = Base64.encodeToString(sha_HMAC.doFinal(message.getBytes(charset)), Base64.DEFAULT);
    }
    catch (Exception e){
        System.out.println("Error");
    }

    return hash;
}

public void searchProducts(String keywords) {
    String requestUrl = "";
    String queryString = buildQueryString(keywords);
    String signature = buildSignature(queryString);

    Log.d(TAG, "signature: " + signature);

    try {
        requestUrl = "http://" + endpoint + uri + "?" + queryString + "&Signature=" + URLEncoder.encode(signature, charset);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    Log.d(TAG, "requestUrl: " + requestUrl);

        Ion.with(context)
            .load(requestUrl)
            .asString()
            .setCallback(new FutureCallback<String>() {
                @Override
                public void onCompleted(Exception e, String result) {
                    Log.d(TAG, "searchProducts result: " + result);
                }
            });
}

可能是什么问题?

【问题讨论】:

    标签: android amazon-web-services


    【解决方案1】:

    确保您的系统时钟正确。使用 NTP 同步它是个好主意。过去,当时间不同步时,我看到过签名错误。

    【讨论】:

      【解决方案2】:

      我之前看到的是这通常归结为权限。检查访问权限和密钥是否正确,并且您有足够的权限。

      【讨论】:

        【解决方案3】:

        改变:

        Base64.DEFAULT;
        

        收件人:

        Base64.NO_WRAP;
        

        【讨论】:

          【解决方案4】:

          很难从代码中分辨出来。需要检查的几件事:

          • 确保您要访问的服务使用 SigV2 签名(或查询字符串签名)。新服务遵循第 4 版签名标准。
          • URLEncoder.encode 不符合 AWS 的编码要求 RFC 3986。您需要对编码的字符串进行一些修复。
          • 应以不区分大小写的方式对查询字符串进行排序。
          • 您的凭据确实正确。

          看看QueryStringSigner.java在官方SDK中是如何实现的,Signature Version 2 Signing Process是个好主意。

          PS:不使用官方SDK的原因是什么?

          【讨论】:

          【解决方案5】:

          过去我遇到此问题时,与系统时间有关。与我同步时间与 NTP 修复问题

          【讨论】:

            【解决方案6】:

            可能是由于

            1. 文件名(或路径)中的空格。

            2. 未正确编码的字符。主要是/+

              生成不包含这些字符的新密钥可能会有所帮助。有关this issuethis one 的更多信息。

            【讨论】:

              猜你喜欢
              • 2019-03-09
              • 2020-02-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-23
              • 2016-11-02
              • 2016-10-12
              • 1970-01-01
              相关资源
              最近更新 更多