Amazon web services JMeter抛出错误';签名不';t匹配';将文件上载到s3时

Amazon web services JMeter抛出错误';签名不';t匹配';将文件上载到s3时,amazon-web-services,amazon-s3,jmeter,performance-testing,Amazon Web Services,Amazon S3,Jmeter,Performance Testing,有人能帮我弄清楚发生了什么事吗 我正在尝试加载测试一个用户可以上传和下载文件的应用程序 旅程: 步骤1:当用户从磁盘选择文件(POST请求)时,它会创建一个文件ID和带有uuid的路径 答复如下: {id:“FILE-VX-1234”,“path:“uuid/filename.jpg”,“uri:[“s3://{location}/{uuid}/{filename}?endpoint=s3.dualstack.eu-west-1.amazonaws.com],“state:“OPEN”,“siz

有人能帮我弄清楚发生了什么事吗

我正在尝试加载测试一个用户可以上传和下载文件的应用程序

旅程:

步骤1:当用户从磁盘选择文件(POST请求)时,它会创建一个文件ID和带有uuid的路径

答复如下:
{id:“FILE-VX-1234”,“path:“uuid/filename.jpg”,“uri:[“s3://{location}/{uuid}/{filename}?endpoint=s3.dualstack.eu-west-1.amazonaws.com],“state:“OPEN”,“size:-1”,“timestamp:“2020-02-13T10:59:43.146+0000”,“refreshFlag”:1,“storage:“storage:”STORAGEID”,“metadata:{}

步骤2:使用这些(POST请求),它用带有assesskeyID、secretaccesskey和sessionToken的S3URI进行响应

答复如下:
{“uri”:[“s3://{accesskeyID}:{secretaccesskey}@{storage location}/{uuid}/{filename}?endpoint=s3.dualstack.eu-west-1.amazonaws.com&sessionToken={security token}”}

步骤3:使用这些参数和添加的临时参数(日期),PUT请求将文件上传到s3存储桶中

标题看起来像:

Accept: */*

Accept-Encoding: gzip, deflate, br

Accept-Language: en-GB,en-US;q=0.9,en;q=0.8

Authorization: AWS4-HMAC-SHA256 Credential=${accesskeyID}/${currentDate}/{region}/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=${secretaccesskey}

Connection: keep-alive

Content-Length: 145541

Content-Type: image/jpeg

Host: <the host address>

Origin: https://{url}

Referer: https://{url}/upload/

Sec-Fetch-Mode: cors

Sec-Fetch-Site: cross-site

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36

X-Amz-Content-Sha256: UNSIGNED-PAYLOAD

X-Amz-Date:${currentDateInUTC}

x-amz-security-token: ${sessionToken}

X-Amz-User-Agent: aws-sdk-js/2.409.0 callback
接受:*/*
接受编码:gzip,deflate,br
接受语言:en GB,en US;q=0.9,en;q=0.8
授权:AWS4-HMAC-SHA256凭证=${accesskeyID}/${currentDate}/{region}/s3/AWS4_请求,SignedHeaders=host;x-amz-content-SHA256;x-amz-date;x-amz-security-token;x-amz-user-agent,签名=${secretaccesskey}
连接:保持活力
内容长度:145541
内容类型:图像/jpeg
主持人:
来源:https://{url}
参考:https://{url}/上传/
秒取数模式:cors
Sec获取站点:跨站点
用户代理:Mozilla/5.0(Macintosh;英特尔Mac OS X 10_14_6)AppleWebKit/537.36(KHTML,如Gecko)Chrome/79.0.3945.130 Safari/537.36
X-Amz-Content-Sha256:未签名的有效负载
X-Amz-Date:${currentDateInUTC}
x-amz-security-token:${sessionToken}
X-Amz-User-Agent:aws sdk js/2.409.0回调
错误:
signaturedesnotmatch
我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法。

我已经验证了在PUT请求中传递的签名(secretaccesskey)、accesskeyID和sessionToken是正确的


注意:授权错误中的附加参数date和“{region}/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent”是硬编码的。

如果不知道如何生成请求的签名,就无法提供任何帮助

根据文章

Amazon S3 REST API使用基于密钥HMAC(散列消息身份验证码)的自定义HTTP方案进行身份验证。要对请求进行身份验证,首先将请求的选定元素串联起来形成一个字符串。然后使用AWS密钥访问该字符串以计算该字符串的HMAC。我们非正式地称此过程为“对请求进行签名”,我们将HMAC算法的输出称为签名,因为它模拟真实签名的安全属性。最后,使用本节中描述的语法将此签名添加为请求的参数

下面是一段伪代码,演示如何生成标头:

Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature;

Signature = Base64( HMAC-SHA1( YourSecretAccessKey, UTF-8-Encoding-Of( StringToSign ) ) );

StringToSign = HTTP-Verb + "\n" +
    Content-MD5 + "\n" +
    Content-Type + "\n" +
    Date + "\n" +
    CanonicalizedAmzHeaders +
    CanonicalizedResource;

CanonicalizedResource = [ "/" + Bucket ] +
    <HTTP-Request-URI, from the protocol name up to the query string> +
    [ subresource, if present. For example "?acl", "?location", "?logging", or "?torrent"];

CanonicalizedAmzHeaders = <described below>
Authorization=“AWS”+”“+AWSAccessKeyId+”:“+签名;
签名=Base64(HMAC-SHA1(您的secretAccessKey,UTF-8-Encoding-Of(StringToSign));
StringToSign=HTTP动词+“\n”+
Content-MD5+“\n”+
内容类型+“\n”+
日期+“\n”+
标准化的达姆扎德人+
规范化资源;
CanonicalizedResource=[“/”+存储桶]+
+
[子资源,如果存在。例如“acl”、“位置”、“日志记录”或“torrent”];
规范化DAMZHEADERS=

您可以查看文章中的示例实现。

大家好!这里有什么帮助吗?我的进展是,理论上这应该可以工作,因为我正在传递所有参数。但是,使用一些库来让授权头工作会更好/更容易。我也在中找到了示例。无论如何,如果有人能给我指出righ,这将是很有帮助的t方向。