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

JMeter在将文件上载到s3时抛出错误“签名不匹配”

秦炜
2023-03-14

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

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

旅程:

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

响应如下:{id:FILE-VX-1234,path:uuid/filename.jpg,uri:[s3://{place}/{uuid}/{filename}?endpoint=s3.dualstack.eu-west-1.amazonaws.com],状态:OPEN,大小:-1,时间戳:2020-02-13T10:59:43.146 0000,刷新标志:1,存储:STORAGEID,元数据:{}

第2步:使用这些(POST请求),它用s3 uri响应,并带有评估码ID、秘书访问码和会话令牌。

响应如下:{uri:[s3://{存贮位置}/{uuid}/{文件名}?endpoint=s3.dualstack.eu-west-1.amazonaws.com

步骤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

错误:

我已经验证了在PUT请求中传递的签名(秘密访问密钥)、访问密钥ID和会话令牌是正确的。

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


共有1个答案

西门鹏程
2023-03-14

如果不了解如何为请求生成签名(即授权标题),就不可能提供任何帮助

根据签名和验证REST请求文章

AmazonS3RESTAPI使用基于密钥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>

您可以在JMeterforAPI测试文章(例如实现)中检查如何处理动态AWS SigV4。

 类似资料:
  • 尝试将文件上载到S3 Bucket,我使用以下代码设置SDK: 错误日志 可能的错误: URL应基于以下表单:文档

  • 我正在开发一个特性,使用Angular/预签名url和API Gateway/lambda生成预签名url将文件上传到S3。 我的工作流描述如下: 从模板中获取选定文件 请求我的api(网关/lambda)使用文件名生成预签名的URL。 const body={filename:this.selectedfile.name}const preSignedUrl=await this.http.po

  • 我正在尝试使用预先签名的URL将文件上传到Amazon的S3。我从生成URL的服务器获取URL https://com-example-mysite.s3-us-east-1.amazonaws.com/userFolder/ImageName?X-Amz安全令牌=xxfoox///xxbarxx= 不幸的是,当我将其传递给Refught2时,它会修改试图将其转换为URL的字符串。我设置了,它解决

  • 我试图使用angular客户端将文件上传到Amazon S3。我已经使用NodeJs应用服务器生成了一个预先签名的URL。在将文件上传到预先签名的URL时,我收到一个错误,如下所示: "对预检请求的响应没有通过权限改造检查:请求的资源上没有'Access-Control-Allow-Origin'标头。因此不允许访问Origin'http://localhost:4200'。" 我已将以下 COR

  • 这里是我的node.js预签名URL的生成 那么我在URL生成或卷曲方面的问题在哪里呢?谢谢

  • 标题说明一切。这是我的代码; 我使用节点强大的文件。 成功上传后,url变量返回s3 url,类似以下内容; 下面是我的参数 我错过了什么?