

# Solucionar problemas de assinatura do Signature Version 4 para solicitações de API da AWS
<a name="reference_sigv-troubleshooting"></a>

**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.

**Topics**
+ [Erros de credencial](#signature-v4-troubleshooting-credential)
+ [Erros de solicitação canônica e string de assinatura](#signature-v4-troubleshooting-canonical-errors)
+ [Erros de escopo de credenciais](#signature-v4-troubleshooting-credential-scope)
+ [Erros de assinatura de chave](#signature-v4-troubleshooting-key-signing)

## Erros de credencial
<a name="signature-v4-troubleshooting-credential"></a>

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](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html#add-signature-to-request) 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](troubleshoot_access-denied.md). 

## Erros de solicitação canônica e string de assinatura
<a name="signature-v4-troubleshooting-canonical-errors"></a>

Se você calculou incorretamente a solicitação canônica em [Criar um hash para a solicitação canônica](reference_sigv-create-signed-request.md#create-canonical-request-hash) ou [Criar uma string para assinar](reference_sigv-create-signed-request.md#create-string-to-sign), 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.

**Example 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
<a name="signature-v4-troubleshooting-credential-header"></a>

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](reference_sigv-create-signed-request.md#calculate-signature) 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.

1. Obtenha o [cabeçalho de autorização](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv-authentication-methods.html) 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
   ```

1. Calcule um hash SHA-256 do cabeçalho de autorização.

   ```
   hashSHA256(rawAuthorizationHeader) = hashedAuthorizationHeader
   ```

1. Codifique o cabeçalho de autorização com hash no formato Base64. 

   ```
   base64(hashedAuthorizationHeader) = encodedHashedAuthorizationHeader
   ```

1. 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
<a name="signature-v4-troubleshooting-credential-scope"></a>

O escopo da credencial criado em [Criar uma string para assinar](reference_sigv-create-signed-request.md#create-string-to-sign) 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\$1request, 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
<a name="signature-v4-troubleshooting-key-signing"></a>

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 obter exemplos, consulte [Exemplos de assinatura de solicitação](reference_sigv-examples.md)