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

AWS API 요청에 대한 Signature Version 4 서명 문제 해결

중요

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. 요청에 서명하는 데 사용된 엔터티에 요청을 할 권한이 있는지 확인합니다. 세부 정보는 액세스 거부 오류 메시지 문제 해결을 참조하세요.

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

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

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 요청 헤더

인증 헤더가 비어 있거나, 자격 증명 키 또는 서명이 없거나 올바르지 않거나, 헤더가 알고리즘 이름으로 시작하지 않거나, 키 값 쌍에 등호가 포함되지 않은 경우 다음 오류 중 하나가 발생합니다.

  • 인증 헤더는 비워 둘 수 없습니다.

  • 인증 헤더에는 '자격 증명' 매개변수가 필요합니다.

  • 인증 헤더에는 '서명' 매개변수가 필요합니다.

  • 인증 헤더에서 잘못된 키=값 쌍(등호 누락)이 서명에 포함되어 있습니다.

서명 계산에서 추가한 SigV4 인증 헤더에 올바른 자격 증명 키가 포함되어 있는지 및 HTTP 날짜 또는 x-amz-date 헤더를 사용하는 요청 날짜도 포함되어 있는지 확인합니다.

IncompleteSignatureException 오류가 발생했고 서명의 구성이 올바른 경우 클라이언트측 요청에서 권한 부여 헤더의 SHA-256 해시 및 B64 인코딩을 계산하여 AWS 서비스로 전송되는 동안 인증 헤더가 수정되지 않았는지 확인할 수 있습니다.

  1. 요청에서 전송한 인증 헤더를 가져옵니다. 인증 헤더는 다음 예제와 유사합니다.

    Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-date, Signature=example-generated-signature
  2. 인증 헤더의 SHA-256 해시를 계산합니다.

    hashSHA256(rawAuthorizationHeader) = hashedAuthorizationHeader
  3. 해시된 인증 헤더를 Base64 형식으로 인코딩합니다.

    base64(hashedAuthorizationHeader) = encodedHashedAuthorizationHeader
  4. 방금 계산한 해시 및 인코딩된 문자열을 오류 메시지로 받은 문자열과 비교합니다. 오류 메시지는 다음 예와 유사해야 합니다.

    com.amazon.coral.service#IncompleteSignatureException: The signature contains an in-valid key=value pair (missing equal-sign) in Authorization header (hashed with SHA-256 and encoded with Base64): '9c574f83b4b950926da4a99c2b43418b3db8d97d571b5e18dd0e4f3c3ed1ed2c'.
  • 두 해시가 다른 경우 전송 중에 인증 헤더의 일부가 변경된 것입니다. 이는 네트워크 또는 클라이언트 핸들러가 서명된 헤더를 연결하거나 인증 헤더를 어떤 식으로든 변경했기 때문일 수 있습니다.

  • 두 해시가 일치하면 요청에서 보낸 인증 헤더가 AWS에서 받은 것과 일치합니다. 수신된 오류 메시지를 검토하여 문제가 잘못된 자격 증명이나 서명으로 인한 것인지 확인합니다. 이러한 오류는 이 페이지의 다른 섹션에서 다룹니다.

보안 인증 범위 오류

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

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
리전

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

Credential should be scoped to a valid Region, not region-code
Service

보안 인증 범위에 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에 대한 요청을 보냅니다. 예제는 서명 요청 예 단원을 참조하십시오.