我收到SignatureDoesNotMatch错误(我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法),同时发出“GET”请求,只有在使用V4签名使用Query参数进行GET请求时。 但是使用V2签名一切正常。 没有查询参数,我可以使用V4和V2签名进行GET(从S3下载文件),HEAD和PUT请求。
我使用了AWS的AmazonS3SigV4_Samples_CSharp示例。现在我尝试使用REST API列出来自存储桶的对象(将前缀作为空白,仅从根目录列出)
这是我的代码段
var endpointUri = "http://s3-us-west-2.amazonaws.com:80/mytestbucket/?delimiter=%2f&prefix";
var uri = new Uri(endpointUri);
// for a simple GET, we have no body so supply the precomputed 'empty' hash
var headers = new Dictionary<string, string>
{
{AWS4SignerBase.X_Amz_Content_SHA256, AWS4SignerBase.EMPTY_BODY_SHA256},
{"content-type", "text/plain"}
};
var signer = new AWS4SignerForAuthorizationHeader
{
EndpointUri = uri,
HttpMethod = "GET",
Service = "s3",
Region = "us-west-2"
};
var authorization = signer.ComputeSignature(headers, "?delimiter=%2f&prefix", AWS4SignerBase.EMPTY_BODY_SHA256, AWSAccessKey, AWSSecretKey);
// place the computed signature into a formatted 'Authorization' header
// and call S3
headers.Add("Authorization", authorization);
HttpHelpers.InvokeHttpRequest(uri, "GET", headers, null);
我怀疑在使用Query-parameter时我做错了,因为使用相同的程序我可以发出GET请求来下载文件(在ComputeSignature方法中传递空查询参数)。
有什么想法吗?
谢谢