Solucionar problemas de assinatura do Signature Version 4 para solicitações de API 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.
Possíveis causas
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 Solucionar 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 Criar um hash para a solicitação canônica ou 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
Quando o cabeçalho de autorização está vazio, a chave ou assinatura da credencial está ausente ou está incorreta, o cabeçalho não começa com um nome de algoritmo ou os pares de valores-chave não incluem um sinal de igual, você recebe um dos seguintes erros:
-
O cabeçalho de autorização não pode estar vazio.
-
O cabeçalho de autorização requer o parâmetro “Credential”.
-
O cabeçalho de autorização requer o parâmetro “Signature”.
-
A assinatura contém um par de chave=valor inválido (sem sinal de igualdade) no cabeçalho de autorização.
Certifique-se de que o cabeçalho de autorização SigV4 que você adicionou em Calcular a assinatura inclua a chave de credencial correta e também a data da solicitação usando HTTP Date ou o cabeçalho.
Se você recebeu um erro IncompleteSignatureException e a construção da assinatura está correta, você pode verificar se o cabeçalho de autorização não foi modificado em trânsito para o computando um hash SHA-256 e a codificação B64 do cabeçalho de autorização em sua solicitação AWS service (Serviço da AWS) do lado do cliente.
-
Obtenha o cabeçalho de autorização que você enviou na solicitação. Seu cabeçalho de autorização é semelhante ao seguinte exemplo:
Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-date, Signature=example-generated-signature
-
Calcule um hash SHA-256 do cabeçalho de autorização.
hashSHA256(rawAuthorizationHeader) = hashedAuthorizationHeader
-
Codifique o cabeçalho de autorização com hash no formato Base64.
base64(hashedAuthorizationHeader) = encodedHashedAuthorizationHeader
-
Compare a string codificada e com hash que você acabou de calcular com a string que você recebeu na sua mensagem de erro. Sua mensagem de erro deve ser semelhante ao exemplo a seguir:
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'.
-
Se os dois hashes forem diferentes, então alguma parte do cabeçalho de autorização foi alterada em trânsito. Essa alteração pode ocorrer devido ao fato de seus manipuladores de rede ou cliente anexarem cabeçalhos assinados ou alterarem o cabeçalho de autorização de alguma forma.
-
Se os dois hashes corresponderem, o cabeçalho de autorização que você enviou na solicitação corresponderá ao AWS recebido. Analise a mensagem de erro que você recebeu para determinar se o problema é resultado de credenciais ou assinaturas incorretas. Esses erros são abordados nas outras seções desta página.
Erros de escopo de credenciais
O escopo da credencial criado em 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 thandate
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 thandate
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