programing

Amazon MWS - 계산된 요청 서명이 제공된 서명과 일치하지 않습니다.

mytipbox 2023. 7. 17. 22:32
반응형

Amazon MWS - 계산된 요청 서명이 제공된 서명과 일치하지 않습니다.

https://mws.amazonservices.com/ 에서 다음 오류 메시지가 표시됩니다.

<Type>Sender</Type>
<Code>SignatureDoesNotMatch</Code>
−
<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.
</Message>

제가 요청을 계산하기 위해 사용하고 있는 VB.net 코드입니다.보안상의 이유로 SecretKey와 AWSAccessKeyId를 제거하였습니다.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim sURL As String = "https://mws.amazonservices.com/"

        Dim sRequest As String = ""
        sRequest &= "Acknowledged=" & Server.UrlEncode("false")
        sRequest &= "&Action=" & Server.UrlEncode("GetReportList")
        sRequest &= "&AWSAccessKeyId=" & Server.UrlEncode("REMOVED-FOR-SECURITY")
        sRequest &= "&Marketplace=" & Server.UrlEncode("REMOVED-FOR-SECURITY")
        sRequest &= "&Merchant=" & Server.UrlEncode("REMOVED-FOR-SECURITY")
        sRequest &= "&SignatureMethod=" & Server.UrlEncode("HmacSHA256")
        sRequest &= "&SignatureVersion=" & Server.UrlEncode("2")
        sRequest &= "&Timestamp=" & Server.UrlEncode(DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssCST"))
        sRequest &= "&Version=" & Server.UrlEncode("2009-01-01")

        Dim StringToSign As String = "GET\n" & "mws.amazonservices.com\n" & "/\n" & sRequest
        sRequest &= "&Signature=" & Server.UrlEncode(HashString(StringToSign))

        Response.Write("<a href=""" & sURL & "?" & sRequest & """>Click here</a>")

    End Sub

    Public Shared Function HashString(ByVal StringToHash As String) As String
        Dim myEncoder As New System.Text.UTF8Encoding
        Dim Key() As Byte = myEncoder.GetBytes("REMOVED-FOR-SECURITY")
        Dim XML() As Byte = myEncoder.GetBytes(StringToHash)
        Dim myHMACSHA256 As New System.Security.Cryptography.HMACSHA256(Key)
        Dim HashCode As Byte() = myHMACSHA256.ComputeHash(XML)
        Return Convert.ToBase64String(HashCode)
    End Function

일부 Amazon 문서 작업을 시작한 후 Google에서 여기에 도착하는 경우, 비밀 액세스 키의 실수로 선행 또는 후행 공백으로 인해 위의 '서명 요청' 오류가 나타날 가능성이 높습니다.그것부터 확인하세요!

제 경험상, 이 오류는 "당신의 매개변수 중 하나가 틀렸습니다. 잘 찾으십시오!"를 의미합니다.저는 S3 SDK를 사용하여 이 오류를 발생시켰습니다.파일을 업로드하려다가 실수로 전체 파일 경로("C:\Users\addaone\image.png")를 파일 이름 대신 키로 지정합니다.

해결책은 새 액세스 키를 생성하는 것이었습니다.저의 첫 AWS SecretKey에는 문제의 원인이 될 수 있는 후행 슬래시가 있는 반면, 새 AWSecretKey에는 후행 슬래시가 없어 작동했습니다.

저도 이 문제에 부딪혔습니다.저는 실수로 버킷 이름 앞에 /를 붙였기 때문입니다.

제 버킷 이름은 test/foo/bar 대신 /test/foo/bar였습니다.

URL 인코딩을 하지 않아서 이 오류를 발견했습니다. 전달된 매개 변수 중 하나가 올바르지 않으면 이 오류가 반환되는 것 같습니다. 액세스 키와 전혀 관련이 없을 수 있습니다.

또한 각 매개 변수를 ASCII 값으로 정렬해야 할 수도 있습니다."AWSAccessKeyId" 매개 변수는 "Marketplace" 앞에 와야 하지만 "AWSAccessId" 뒤에 "AssociatedTag"가 와야 합니다.

Andrew와 유사한 답변(승인된 답변)이지만, 내 후행 공백은 키가 아니라 S3 업로드를 위한 메타데이터에 있었습니다.

using (AmazonS3Client client = new AmazonS3Client(region))
{
    PutObjectRequest putObjectRequest = new PutObjectRequest
    {
        ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256,
        InputStream = stream,
        BucketName = s3Bucket,
        Key = key,
        ContentType = "application/octet-stream",
        Timeout = TimeSpan.FromMinutes(60), //http timeout talking to S3, including upload time.
        ReadWriteTimeout = TimeSpan.FromMinutes(5) //timeout reading the input stream
    };
    if (!string.IsNullOrEmpty(fileName))
        putObjectRequest.Metadata.Add("Name", fileName); 
    PutObjectResponse putObjectResponse = client.PutObject(putObjectRequest);
    // Exception in client.PutObject if fileName has leading spaces in Metadata!
}           

콜 스택 위치:

The request signature we calculated does not match the signature you provided. Check your key and signing method.
at Amazon.Runtime.Internal.HttpErrorResponseExceptionHandler.HandleException(IExecutionContext executionContext, HttpErrorResponseException exception) in d:\Jenkins\jobs\v3-stage-release\workspace\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Pipeline\ErrorHandler\HttpErrorResponseExceptionHandler.cs:line 116
at Amazon.Runtime.Internal.ExceptionHandler`1.Handle(IExecutionContext executionContext, Exception exception) in d:\Jenkins\jobs\v3-stage-release\workspace\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Pipeline\ErrorHandler\ExceptionHandler.cs:line 38
[...]
at Amazon.Runtime.AmazonServiceClient.Invoke[TRequest,TResponse](TRequest request, IMarshaller`2 marshaller, ResponseUnmarshaller unmarshaller) in d:\Jenkins\jobs\v3-stage-release\workspace\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AmazonServiceClient.cs:line 117
at Amazon.S3.AmazonS3Client.PutObject(PutObjectRequest request) in d:\Jenkins\jobs\v3-stage-release\workspace\AWSDotNetPublic\sdk\src\Services\S3\Generated\_bcl45\AmazonS3Client.cs:line 3646
at MoveDocumentDataToDisk.AwsRepository.PutObject(RegionEndpoint region, String s3Bucket, String key, String fileName, Stream stream) in C:\code\clarinetsupportfiles\MoveDocumentDataToDisk\MoveDocumentDataToDisk\Program.cs:line 314

웹 클라이언트를 사용하여 Amazon 3S URL에 파일을 다운로드할 때 동일한 오류 메시지가 표시되었습니다.저는 여기에 그것에 대해 블로그를 썼습니다: http://blog.cdeutsch.com/2010/11/net-webclient-403-forbidden-error.html

제가 사용한 최종 솔루션은 여기에 있습니다: URL 인코딩 슬래시로 URL 가져오기

제가 누군가로부터 환경 변수를 복사했지만 자리 표시자 텍스트만 있었기 때문입니다.

0바이트 파일을 업로드하려고 할 때도 이 문제가 발생합니다.나는 오늘 여기서 버그를 오픈했습니다.

역할이 구성된 방식과 관련된 실수일 때 동일한 '계산된 일치하지 않음' 메시지가 표시됨

버킷에 대한 역할, 정책 및 CORS 구성을 확인하여 사용 중인 헤더를 사용할 수 있는 권한이 있는지 확인합니다.

저의 경우, 저는 그것을 포함하고 있었습니다.

ACL: 'public-read' 

버킷 서명 시 매개 변수 및

xhr.setRequestHeader('x-amz-acl', 'public-read');

이미지를 업로드하는 동안.

"s3:"를 놓쳤습니다.PutObjectAcl", 연관된 사용자에 대한 권한입니다.여기 효과가 있었던 정책이 있습니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "Stmt12345",
        "Effect": "Allow",
        "Action": [
            "s3:DeleteObject",
            "s3:GetObject",
            "s3:ListBucket",
            "s3:PutObject",
            "s3:PutObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::mybucketname/*"
        ],
        "Condition": {
            "StringEquals": {
                "s3:x-amz-acl": [
                    "public-read"
                ]
            }
        }
    }
  ]
}

URL이 잘못되었을 때 이 문제가 발생했습니다(때로는 이 오류가 발생했고, 때로는 키를 찾을 수 없다고 표시되어 404 오류를 의미합니다).이러한 URL은 대소문자를 구분하므로 정확한지 확인하십시오.제 URL에 ".jpg"가 있어서 "가 필요했습니다.JPG"

방금 이 오류가 발생했습니다.나는 PHP를 사용하고 있고, 실행했습니다.scandir()내 파일들과 함께 내 디렉토리에.

scandir() 환된함수반.그리고...배열의 처음 두 인덱스로 사용됩니다.에 조건문을 추가하여 이들에 대한 파일을 만들지 않도록 한 후 작동했습니다.

이 문제는 IAM 사용자의 "비밀번호"를 "개인 액세스 키" 대신 CLI에 배치한 사용자에게 발생할 수 있습니다."개인 액세스 키"는 어디에 있습니까?검색할 수 없지만 다음을 통해 새 항목을 만들 수 있습니다.

  • IAM, 사용자, 액세스 키 관리, 액세스 키 생성
  • 좋아요, 열쇠를 빨리 복사하세요!그것이 당신의 유일한 기회입니다.:)

SubmitFeed 호출에서도 동일한 오류가 발생했으며 몇 시간 동안 디버깅한 결과 CURL이 POST 요청PUT 요청으로 전환하여 서명이 무효화되었습니다.

curl_setopt()를 통해 CURLINFO_HEADER_OUT를 1로 설정하는 데 많은 도움이 되었기 때문에, 나중에 curl_getinfo()로 전화를 걸어 제 요청이 PUT 요청이라고 말했습니다.

그래서 저는 Amazon PHP 라이브러리의 CURL 옵션을 curl_setopt()를 통해 수행한 작업과 비교했고, tataa: Amazon PHP 라이브러리는 다음과 같은 작업을 수행합니다.

curl_setopt(CURLINFO_HEADER_OUT, 'POST');

(또는 GET(자체:REQUEST_TYPE에 따라 다름).저의 CURL 요청에서도 동일한 작업을 수행하여 요청을 PUT에서 POST로 전환하여 해시 서명이 다시 손상되지 않았습니다.

다음을 사용하여 동일한 문제가 발생했습니다.curl0바이트 파일을 S3 사전 서명된 url에 업로드하는 명령입니다.

헤더를 제거할 때 찾았습니다.-H 'Content-Type: application/octet-stream'그러면 작동할 수 있습니다.

Ruby의 aws-sdk v1을 사용하고 있었는데 다음과 같은 오류가 발생했습니다.content type방문할 때url_for문서에서 예를 따릅니다.제거content_type의 매개 변수url_for저를 위해 문제를 해결해 주었습니다.

이전 버전의 AWS C# SDK(1.5.10.0)를 사용하는 콘솔 앱이 아닌 웹 서버에서 이 메시지를 받았습니다.최신 버전으로 업그레이드한 후에는 문제가 사라졌습니다.

요청 헤더를 확인하십시오. 제 경우 복사한 코드에서 다음이 포함된 추가 헤더를 보냅니다.

HOST: localhost:8080

많은 어려움을 겪은 후, 저는 입력 스트림 대신 putObject Constructor를 사용하여 파일을 업로드했고 작동했습니다.하지만 무엇이 잘못되었는지는 잘 모르겠습니다.

PHP: s3에서 폴더를 나타내는 "/"를 추가할 때 버킷 이름에 추가할 때 aws-package의 PUTOBJECT 명령이 "/"를 "%2F"로 대체한 것으로 보여 요청의 sha256 계산에 실패했습니다.
awsbucket%2F폴더/파일 이름
하지만 아마도 다음과 같은 방법으로 샤를 사전 계산했을 것입니다.
aws 버킷/폴더/폴더

대신 폴더 이름을 파일 이름에 미리 추가하는 것이 해결책이었습니다.

출처:
aws 버킷/폴더
파일 이름
대상:
양동이
폴더/폴더

다음을 사용하여 이 문제에 부딪혔습니다..net core 2.1.300-preview1뿐만 아니라.2.1.300-rc1로 업데이트하는 것이 해결책이었습니다.

스택에 대한 답변 1개 더: 데이터 스트리밍 시도 & 콘텐츠 길이로 설정 -1도 이 오류를 표시합니다.

aWS_SECRET_ACCESS_KEY 값이 잘못되어 java에서 이 오류가 발생했습니다...그것은 내 pem 파일을 잘못 가리켰습니다.대신 여기에 있는 액세스 키의 비밀 값인 https://console.aws.amazon.com/iam/home?region=us-east-1 #/security_credentials를 사용해야 했습니다.

언급URL : https://stackoverflow.com/questions/2777078/amazon-mws-request-signature-calculated-does-not-match-the-signature-provided

반응형