Solucionar problemas de solicitações assinadas de APIs da AWS - AWS Identity and Access Management

Solucionar problemas de solicitações assinadas de APIs da AWS

Importante

A menos que você esteja usando AWS SDKs ou a CLI, é necessário escrever código para calcular assinaturas que forneçam informações de autenticação em suas solicitações. O cálculo da assinatura no SigV4 pode ser uma tarefa complexa. Por isso, recomenda-se usar os AWS SDKs ou a CLI sempre que possível.

Ao desenvolver um código que cria uma solicitação assinada, uma mensagem HTTP 403 SignatureDoesNotMatch poderá ser recebida dos Serviços da AWS. Esses erros significam que o valor da assinatura em sua solicitação HTTP para a AWS não correspondeu à assinatura calculada pelo AWS service (Serviço da AWS). Os erros HTTP 401 Unauthorized são retornados quando as permissões não permitem que o chamador faça a solicitação.

As solicitações de API podem retornar um erro se:

  • A solicitação da API não é 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ão para invocar a API.

  • A assinatura da solicitação de API assinada não corresponde à assinatura calculada pelo serviço da AWS.

  • O cabeçalho da solicitação da API está incorreto.

nota

Atualize seu protocolo de assinatura do AWS Signature Version 2 (SigV2) para o AWS Signature Version 4 (SigV4) antes de explorar outras soluções de erro. Serviços, como o Amazon S3, e regiões não oferecem mais suporte a assinaturas SigV2.

Erros de credencial

Certifique-se de que a solicitação de API seja assinada com o SigV4. Se a solicitação da API não estiver assinada, o seguinte erro poderá ser recebido: Missing Authentication Token. Adicione a assinatura que falta e reenvie a solicitação.

Verifique se as credenciais de autenticação para a chave de acesso e a chave secreta estão corretas. Se a chave de acesso estiver incorreta, o seguinte erro poderá ser recebido: Unauthorized. Certifique-se de que a entidade usada para assinar a solicitação esteja autorizada a fazer a solicitação. Para obter detalhes, consulte Solução de problemas de mensagens de erro de acesso negado.

Erros de solicitação canônica e string de assinatura

Se você calculou incorretamente a solicitação canônica em Etapa 2: criar um hash para a solicitação canônica ou Etapa 3: criar uma string para assinar, a etapa de verificação de assinatura executada pelo serviço falhará com a mensagem de erro:

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

Quando o serviço da AWS recebe uma solicitação assinada, ele recalcula a assinatura. Se houver diferenças nos valores, as assinaturas não coincidirão. Compare a solicitação canônica e a string à sua solicitação assinada com o valor na mensagem de erro. Modifique o processo de assinatura se houver alguma diferença.

nota

Você também pode verificar se não enviou a solicitação por meio de um proxy que modifica os cabeçalhos ou a solicitação.

exemplo 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 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

Para verificar se a chave secreta corresponde ao ID da chave de acesso, é possível testá-la com uma implementação em funcionamento conhecida. Por exemplo, use um AWS SDK ou a AWS CLI para fazer uma solicitação para a AWS.

Cabeçalho da solicitação de API

Certifique-se de que o cabeçalho de autorização SigV4 que você adicionou a Etapa 4: calcular a assinatura 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, poderá ser recebido o erro: Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. Certifique-se de que a solicitação de autorização SigV4 também inclua a data da solicitação usando HTTP Date ou o cabeçalho x-amz-date.

Erros de escopo de credenciais

O escopo da credencial criado em Etapa 3: criar uma string para assinar restringe a assinatura a uma data, uma região e um serviço específicos. Essa string tem o seguinte formato:

YYYYMMDD/region/service/aws4_request
nota

Se você estiver usando o SIGv4a, a região não estará incluída no escopo da credencial.

Data

Se o escopo da credencial não especificar a mesma data que o cabeçalho x-amz-date, a etapa de verificação da assinatura falhará com a seguinte mensagem de erro:

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

Se a solicitação especificar um horário no futuro, a etapa de verificação da assinatura falhará com a seguinte mensagem de erro:

Signature not yet current: date is still later than date

Se a solicitação tiver expirado, a etapa de verificação da assinatura falhará com a seguinte mensagem de erro:

Signature expired: date is now earlier than date
Região

Se o escopo da credencial não especificar a mesma região que a solicitação, a etapa de verificação da assinatura falhará com a seguinte mensagem de erro:

Credential should be scoped to a valid Region, not region-code
Serviço

Se o escopo da credencial não especificar o mesmo serviço que o cabeçalho host, a etapa de verificação da assinatura falhará com a seguinte mensagem de erro:

Credential should be scoped to correct service: 'service'
String de término

Se o escopo da credencial não terminar com aws4_request, a etapa de verificação da assinatura falhará com a seguinte mensagem de erro:

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

Erros de assinatura de chave

Erros causados por derivação incorreta da chave de assinatura ou uso incorreto de criptografia são mais difíceis de solucionar. Após verificar se a string canônica e a string a ser assinada estão corretas, você também pode verificar se há um dos seguintes problemas:

  • A chave de acesso secreta não corresponde à ID de chave de acesso especificada.

  • Existe um problema com seu código de derivação de chaves.

Para verificar se a chave secreta corresponde ao ID da chave de acesso, é possível testá-la com uma implementação em funcionamento conhecida. Por exemplo, use um AWS SDK ou a AWS CLI para fazer uma solicitação para a AWS. Para ver exemplos, consulte Exemplos de assinatura de solicitação