AWS API에 대한 서명된 요청 문제 해결 - AWS Identity and Access Management

AWS API에 대한 서명된 요청 문제 해결

중요

AWS SDK 또는 CLI를 사용하지 않는 한 요청에 인증 정보를 제공하는 서명을 계산하는 코드를 작성해야 합니다. SigV4 서명 계산은 복잡한 작업일 수 있으므로 가능한 경우 AWS SDK 또는 CLI를 사용하는 것이 좋습니다.

서명된 요청을 생성하는 코드를 개발할 때, AWS 서비스에서 HTTP 403 SignatureDoesNotMatch가 발생할 수 있습니다. 이 오류는 AWS에 대한 HTTP 요청의 서명 값이 AWS 서비스에서 계산한 서명과 일치하지 않음을 의미합니다. 권한에서 호출자의 요청을 허용하지 않는 경우 HTTP 401 Unauthorized 오류가 반환됩니다.

다음과 같은 경우 API 요청에서 오류가 반환될 수 있습니다.

  • API 요청이 서명되지 않았으며 API 요청은 IAM 인증을 사용합니다.

  • 요청에 서명하는 데 사용된 IAM 보안 인증이 잘못되었거나 API를 간접적으로 호출할 권한이 없습니다.

  • 서명된 API 요청의 서명이 AWS 서비스에서 계산한 서명과 일치하지 않습니다.

  • API 요청 헤더가 잘못되었습니다.

참고

다른 오류 해결 방법을 살펴보기 전에 AWS Signature Version 2(SigV2)에서 AWS Signature Version 4(SigV4)로 서명 프로토콜을 업데이트합니다. Amazon S3 등의 서비스와 리전은 더 이상 SIGv2 서명을 지원하지 않습니다.

보안 인증 오류

API 요청이 SigV4로 서명되었는지 확인합니다. API 요청이 서명되지 않은 경우 다음과 같은 오류가 발생할 수 있습니다. Missing Authentication Token. 누락된 서명을 추가하고 요청을 다시 전송합니다.

액세스 키 및 비밀 키의 보안 인증이 올바른지 확인합니다. 액세스 키가 잘못된 경우 다음과 같은 오류가 발생할 수 있습니다. Unauthorized. 요청에 서명하는 데 사용된 엔터티에 요청을 할 권한이 있는지 확인합니다. 자세한 내용은 액세스 거부 오류 메시지 문제 해결 섹션을 참조하세요.

표준 요청 및 서명 문자열 오류

2단계: 표준 요청의 해시 생성 또는 3단계: 서명할 문자열 생성에서 표준 요청을 잘못 계산한 경우 서비스에서 수행되는 서명 검증 단계가 실패하고 다음 오류 메시지가 표시됩니다.

The request signature we calculated does not match the signature you provided

AWS 서비스에서 서명된 요청을 수신하면 서명을 다시 계산합니다. 값에 차이가 있으면 서명이 일치하지 않는 것입니다. 표준 요청 및 서명된 요청의 문자열을 오류 메시지의 값과 비교합니다. 차이가 있는 경우 서명 프로세스를 수정합니다.

참고

헤더 또는 요청을 수정하는 프록시를 통해 요청을 전송하지 않았는지 확인할 수도 있습니다.

예 정식 요청 예
GET -------- HTTP method / -------- Path. For API stage endpoint, it should be /{stage-name}/{resource-path} -------- Query string key-value pair. Leave it blank if the request doesn't have a query string. content-type:application/json -------- Header key-value pair. One header per line. host:0123456789.execute-api.us-east-1.amazonaws.com -------- Host and x-amz-date are required headers for all signed requests. x-amz-date:20220806T024003Z content-type;host;x-amz-date -------- A list of signed headers d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501 -------- Hash of the payload

비밀 키가 액세스 키 ID와 일치하는지 확인하려면, 정상적으로 작동하는 것으로 알려진 구현을 사용하여 비밀 키를 테스트합니다. 예를 들어 AWS SDK 또는 AWS CLI를 사용하여 AWS에 대한 요청을 보냅니다.

API 요청 헤더

4단계: 서명 계산에서 추가한 SigV4 권한 부여 헤더에 다음과 유사한 올바른 보안 인증 키가 포함되어 있는지 확인합니다.

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-date, Signature=example-generated-signature

보안 인증 키가 없거나 잘못된 경우 다음과 같은 오류가 표시될 수 있습니다. Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. SigV4 권한 부여 요청에 HTTP Date 또는 x-amz-date 헤더를 사용하는 요청 날짜도 포함되는지 확인합니다.

보안 인증 범위 오류

3단계: 서명할 문자열 생성에서 생성한 보안 인증 범위는 서명을 특정 날짜, 리전 및 서비스로 제한합니다. 이 문자열의 형식은 다음과 같습니다.

YYYYMMDD/region/service/aws4_request
참고

SigV4a를 사용하는 경우 해당 리전은 보안 인증 범위에 포함되지 않습니다.

날짜

보안 인증 범위에 x-amz-date 헤더와 동일한 날짜가 지정되어 있지 않은 경우, 서명 확인 단계가 실패하고 다음 오류 메시지가 표시됩니다.

Date in Credential scope does not match YYYYMMDD from ISO-8601 version of date from HTTP

요청에 미래의 시간이 지정되어 있는 경우, 서명 확인 단계가 실패하고 다음 오류 메시지가 표시됩니다.

Signature not yet current: date is still later than date

요청이 만료된 경우, 서명 확인 단계가 실패하고 다음 오류 메시지가 표시됩니다.

Signature expired: date is now earlier than date
리전(Region)

보안 인증 범위가 요청과 동일한 리전을 지정하지 않는 경우, 서명 확인 단계가 실패하고 다음 오류 메시지가 표시됩니다.

Credential should be scoped to a valid Region, not region-code
서비스

보안 인증 범위에 host 헤더와 동일한 서비스가 지정되어 있지 않은 경우, 서명 확인 단계가 실패하고 다음 오류 메시지가 표시됩니다.

Credential should be scoped to correct service: 'service'
종료 문자열

보안 인증 범위가 aws4_request로 끝나지 않는 경우, 서명 확인 단계가 실패하고 다음 오류 메시지가 표시됩니다.

Credential should be scoped with a valid terminator: 'aws4_request'

키 서명 오류

잘못된 서명 키 추출 또는 잘못된 암호화 사용으로 인해 발생하는 오류는 해결하는 데 어려움이 있습니다. 표준 문자열과 서명할 문자열이 올바른지 확인한 후, 다음 문제 중 하나를 확인할 수도 있습니다.

  • 비밀 액세스 키가 지정된 액세스 키 ID와 일치하지 않습니다.

  • 키 추출 코드에 문제가 있습니다.

비밀 키가 액세스 키 ID와 일치하는지 확인하려면, 정상적으로 작동하는 것으로 알려진 구현을 사용하여 비밀 키를 테스트합니다. 예를 들어 AWS SDK 또는 AWS CLI를 사용하여 AWS에 대한 요청을 보냅니다. 예제는 서명 요청 예 단원을 참조하십시오.