【问题标题】:Signature calculated does not match the signature you provided Amazon计算的签名与您提供的签名不匹配亚马逊
【发布时间】:2015-07-06 17:07:30
【问题描述】:

“我们计算的请求签名与您提供的签名不匹配。请检查您的 AWS Secret Access Key 和签名方法。详情请参阅服务文档”

下面是我的 SignatureHelper(基于 Amazon 类库)。

public string SignRequest(Dictionary<string, string> parametersUrl, Dictionary<string, string> parametersSignture)
{
    var secret = Encoding.UTF8.GetBytes(parametersSignture["Secret"]);
    var signer = new HMACSHA256(secret);

    var stringToSign = CalculateStringToSign(parametersUrl, parametersSignture);
    var toSign = Encoding.UTF8.GetBytes(stringToSign);

    var sigBytes = signer.ComputeHash(toSign);
    var signature = Convert.ToBase64String(sigBytes);

    return signature;
}

private static string CalculateStringToSign(IDictionary<string, string> parameters, IDictionary<string, string> parametersSignture)
{
    var sorted = new SortedDictionary<string, string>(parameters, StringComparer.Ordinal);

    var data = new StringBuilder();
    data.Append(parametersSignture["RequestMethod"]);
    data.Append("\n");

    var endpoint = new Uri(parametersSignture["EndPoint"]);

    data.Append(endpoint.Host);
    if (endpoint.Port != 443 && endpoint.Port != 80)
    {
        data.Append(":")
            .Append(endpoint.Port);
    }

    data.Append("\n");
    var uri = endpoint.AbsolutePath;
    if (uri.Length == 0)
    {
        uri = "/";
    }

    data.Append(UrlEncode(uri, true));
    data.Append("\n");

    foreach (var pair in sorted.Where(pair => pair.Value != null))
    {
        data.Append(UrlEncode(pair.Key, false));
        data.Append("=");
        data.Append(UrlEncode(pair.Value, false));
        data.Append("&");
    }

    var result = data.ToString();

    return result.Remove(result.Length - 1);
}

private static string UrlEncode(string data, bool path)
{
    var encoded = new StringBuilder();
    var unreservedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~" + (path ? "/" : string.Empty);

    foreach (char symbol in Encoding.UTF8.GetBytes(data))
    {
        if (unreservedChars.IndexOf(symbol) != -1)
        {
            encoded.Append(symbol);
        }
        else
        {
            encoded.Append("%" + string.Format("{0:X2}", (int)symbol));
        }
    }

    return encoded.ToString();
}

这是我的数据:

CalculateStringToSign 发布

mws.amazonservices.com
/
AWSAccessKeyId=***&Action=SubmitFeed&FeedType=_POST_PRODUCT_DATA_&MWSAuthToken=****&Merchant=***&PurgeAndReplace=false&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2015-06-30T13%3A47%3A42Z&Version=2009-01-01

网址

"https://mws.amazonservices.com/?AWSAccessKeyId=***&Action=SubmitFeed&Merchant=***&MWSAuthToken=***&SignatureVersion=2&Timestamp=2015-06-30T13%3a47%3a42Z&Version=2009-01-01&Signature=bfSpx9m7PIH3CbKNkjLDwY9norfD8mbTROJyxYnCMSU%3d&SignatureMethod=HmacSHA256&FeedType=_POST_PRODUCT_DATA_&PurgeAndReplace=false+HTTP%2f1.1&x-amazon-user-agent=Developer(Language%3dc%23)"

这是我收到的回复

Code: SignatureDoesNotMatch
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.

我认为它在我的助手中(不确定我查看了许多代码示例,看起来都一样。

谢谢,

克莱尔

【问题讨论】:

  • 您是否有理由不能或不想使用 Amazon SDK 为您进行签名?如果是 v4,请参阅docs.aws.amazon.com/general/latest/gr/… 的故障排除指南。
  • @jarmod 看起来很混乱,我希望能够理解它在做什么,并使用我们的标准将其整合到我们的系统中。我查看了那个故障排除指南,我没有得到返回的字符串,我只能看到标准消息
  • 您使用的是什么版本的签名?看了docs.aws.amazon.com/general/latest/gr/…
  • @ClareBarrington 为什么使用来自平台提供商的现有的、经过充分测试的 SDK 功能比编写自己的、可能有漏洞的版本更“混乱”?但是,如果您真的需要自己进行签名,那么 AWS 文档和开源 SDK 的组合应该会有所帮助。您会发现 v2 签名非常简单,但 v4 签名并不是那么简单。
  • 我认为自己滚动是完全合理的。 SDK 最终会妨碍您。我在这里观察到的第一件事是通常使用大写的 urlencoding,例如= 变为 %3D 而不是 %3d。尾随的 +HTTP/1.1x-amazon-user-agent... 似乎无关紧要。

标签: amazon-web-services


【解决方案1】:

@Michael - sqlbot 是正确的。然而,在解决方案清理并重建后它起作用了:-)

我会建议任何苦苦挣扎的人使用https://mws.amazonservices.co.uk/scratchpad/index.html 并复制“要签名的字符串”,如果您的响应没有产生相同的响应,那么问题在于您的代码是否看到,您如何对其进行编码以及将其附加到请求中(我的问题)。

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2021-10-15
    • 2014-02-22
    • 1970-01-01
    相关资源
    最近更新 更多