Como posso solucionar erros de incompatibilidade de assinatura ao fazer solicitações assinadas com SigV4 com a autenticação do IAM para o API Gateway?

4 minuto de leitura
0

A solicitação assinada Signature Version 4 (SigV4) para o Amazon API Gateway falhou com uma resposta 403 e um erro. O erro é semelhante ao seguinte: “A assinatura da solicitação que calculamos não corresponde à assinatura que você forneceu. Verifique sua chave de acesso secreta da AWS e o método de assinatura.”

Breve descrição

Os endpoints da API Gateway que usam a autenticação do AWS Identity and Access Management (IAM) podem retornar erros 403 quando:

  • A solicitação da API não está assinada e usa a autenticação do IAM.
  • As credenciais do IAM usadas para assinar a solicitação estão incorretas ou não têm permissões para invocar a API.
  • A assinatura da solicitação de API assinada não corresponde à assinatura do endpoint de API do API Gateway.
  • O cabeçalho da solicitação de API está incorreto.

Resolução

Autenticação do IAM

Certifique-se de que a solicitação de API usando a autenticação do IAM esteja assinada com SigV4. Se a solicitação de API não estiver assinada, você poderá receber um erro informando que o token de autenticação está ausente

Credenciais do IAM

Verifique se as credenciais de autenticação da chave de acesso e da chave secreta estão corretas. Se a chave de acesso estiver incorreta, você poderá receber um erro informando que o token de segurança incluído na solicitação é inválido.

Certifique-se de que a entidade do IAM usada para assinar a solicitação tenha permissões execute-api:Invoke. Se a entidade do IAM não tiver permissões execute-api:Invoke, você poderá receber um erro indicado que o usuário não tem autorização para realizar a solicitação no recurso “User: arn:aws:iam::xxxxxxxxxxxx:user/username is not authorized to perform: execute-api:Invoke on resource”

Incompatibilidade de assinaturas

Se a chave de acesso secreta estiver incorreta, você poderá receber um erro indicando que a assinatura da solicitação calculada não corresponde à assinatura fornecida.

A chave de acesso secreta deve corresponder ao ID da chave de acesso no parâmetro Credential. Para obter instruções, siga a seção Enviar uma solicitação para testar as configurações de autenticação, em Como ativar a autenticação do IAM para as APIs REST do API Gateway?

Certifique-se de seguir as instruções para o processo de assinatura SigV4. Se algum valor no cálculo da assinatura estiver incorreto, você poderá receber um erro indicando que a assinatura da solicitação calculada não corresponde à assinatura fornecida.

Quando o API Gateway receber uma solicitação assinada, ele recalculará a assinatura. Se houver diferenças nos valores, o API Gateway receberá uma assinatura diferente. Compare a solicitação canônica e a string com sua solicitação assinada com o valor na mensagem de erro. Modifique o processo de assinatura se houver alguma diferença.

Exemplo de solicitação canônica:

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 any 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 request                       
x-amz-date:20220806T024003Z                              

content-type;host;x-amz-date                             -------- A list of signed headers
d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501        -------- hash of the payload

Exemplo de resposta de erro canônica:

<ErrorResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
  <Error>
    <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.

The canonical string for this request should have been 'GET / Action=ListGroupsForUser&MaxItems=100&UserName=Test&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential
=AKIAIOSFODNN7EXAMPLE%2F20120223%2Fus-east-1%2Fiam%2Faws4_request&X-Amz-Date=20120223T063000Z&X-Amz-SignedHeaders=host
host:iam.amazonaws.com

host
<hashed-value>'

The String-to-Sign should have been
'AWS4-HMAC-SHA256
20120223T063000Z
20120223/us-east-1/iam/aws4_request
<hashed-value>'
</Message>
  </Error>
  <RequestId>4ced6e96-5de8-11e1-aa78-a56908bdf8eb</RequestId>
</ErrorResponse>

Observação: para cabeçalhos de gateway de API, somente os cabeçalhos host e x-amz-date são necessários.

Cabeçalho da solicitação de API

Certifique-se de que o cabeçalho da autorização SigV4 inclua a chave de credencial correta, semelhante à seguinte:

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

Se a chave de credencial estiver ausente ou incorreta, você poderá receber o seguinte erro: “O cabeçalho de autorização requer o parâmetro “Credencial”. O cabeçalho de autorização requer o parâmetro 'Signature'.”

Certifique-se de que a solicitação de autorização SigV4 também inclua a data da solicitação usando a Data HTTP ou o cabeçalho x-amz-date.


Informações relacionadas

Exemplos de código nos SDKs da AWS

Como faço para solucionar os problemas com erros HTTP 403 do API Gateway?