

# Proteger as APIs HTTP no API Gateway
<a name="http-api-protect"></a>

O API Gateway fornece várias maneiras de proteger sua API de determinadas ameaças, como usuários mal-intencionados ou picos de tráfego. É possível proteger a sua API com estratégias como configurar alvos de controle de utilização e habilitar o TLS mútuo. Nesta seção, você pode aprender a habilitar esses recursos usando o API Gateway.

**Topics**
+ [Controle de utilização das solicitações das APIs HTTP para ter um melhor throughput no API Gateway](http-api-throttling.md)
+ [Como ativar a autenticação do TLS mútuo para APIs HTTP no API Gateway](http-api-mutual-tls.md)

# Controle de utilização das solicitações das APIs HTTP para ter um melhor throughput no API Gateway
<a name="http-api-throttling"></a>

Você pode configurar o controle de utilização para as suas APIs para ajudar a protegê-las da sobrecarga de numerosas solicitações. Os controles de utilização são aplicados de acordo com o melhor esforço e devem ser considerados alvos, e não limites máximos garantidos de solicitações.

O API Gateway controla a utilização das solicitações para a sua API usando o algoritmo do bucket de token, em que um token equivale a uma solicitação. Especificamente, o API Gateway analisa a taxa e uma intermitência de envios de solicitações de todas as APIs na sua conta, por região. No algoritmo do bucket de token, uma intermitência pode permitir a saturação predefinida desses limites, mas há alguns casos em que outros fatores também podem exceder tais limites.

Quando os envios de solicitações excederem a taxa de solicitação de estado fixo e os limites de intermitência, o API Gateway iniciará o controle de utilização de solicitações. Neste momento, pode ser que os clientes recebam respostas de erro `429 Too Many Requests`. Ao capturar essas exceções, o cliente poderá reenviar as solicitações com falha de uma forma que restrinja as taxas.

Como desenvolvedor de APIs, você pode definir os limites alvo para estágios ou rotas de APIs particulares para melhorar a performance geral em todas as APIs na sua conta.

## Controle de utilização no nível da conta por região
<a name="http-api-protect-throttling-account"></a>

Por padrão, o API Gateway controla a utilização das solicitações de estado fixo por segundo (RPS) em todas as APIs de uma conta da AWS, por região. Ele também limita a intermitência (ou seja, o tamanho máximo do bucket) em todas as APIs de uma conta da AWS, por região. No API Gateway, o limite de intermitência representa o número máximo alvo de envios simultâneos de solicitações que ele fará antes de retornar respostas de erro `429 Too Many Requests`. Para obter mais informações sobre cotas de controle de utilização, consulte [Cotas do Amazon API Gateway](limits.md).

Os limites por conta são aplicados a todas as APIs em uma conta em uma região especificada. O limite de taxas no nível da conta pode ser aumentado por meio de uma solicitação; é possível obter limites mais altos com APIs com tempos limite mais curtos e cargas úteis menores. Para solicitar um aumento nos limites de controle de utilização no nível da conta por região, entre em contato com a [Central de Suporte da AWS](https://console.aws.amazon.com/support/home#/). Para obter mais informações, consulte [Cotas do Amazon API Gateway](limits.md). Observe que tais limites não podem ser superiores aos limites de controle de utilização da AWS.

## Limitação em nível de rota
<a name="http-api-protect-throttling-route"></a>

Você pode definir a limitação no nível da rota para substituir as limitações de solicitação no nível da conta para um estágio específico ou para rotas individuais em sua API. Os limites de controle de utilização da rota padrão não podem exceder os limites de taxa em nível de conta.

É possível configurar o controle de utilização de nível de rota usando a AWS CLI. O comando [update-stage](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/update-stage.html) indicado abaixo configura o controle de utilização personalizado para o estágio especificado e a rota de uma API:

```
aws apigatewayv2 update-stage \
    --api-id a1b2c3d4 \
    --stage-name dev \
    --route-settings '{"GET /pets":{"ThrottlingBurstLimit":100,"ThrottlingRateLimit":2000}}'
```

# Como ativar a autenticação do TLS mútuo para APIs HTTP no API Gateway
<a name="http-api-mutual-tls"></a>

A autenticação TLS mútua requer autenticação bidirecional entre o cliente e o servidor. Com TLS mútuo, os clientes devem apresentar certificados X.509 para verificar sua identidade a fim de acessar sua API. O TLS mútuo é um requisito comum para a Internet das Coisas (IoT) e aplicações business-to-business. 

É possível usar o TLS mútuo juntamente com outras [operações de autorização e autenticação](apigateway-control-access-to-api.md) compatíveis com o API Gateway. O API Gateway encaminha os certificados que os clientes fornecem aos autorizadores do Lambda e às integrações de backend.

**Importante**  
Por padrão, os clientes podem invocar sua API usando o endpoint `execute-api` gerado pelo API Gateway para sua API. Para garantir que os clientes possam acessar sua API somente usando um nome de domínio personalizado com TLS mútuo, desabilite o endpoint `execute-api` padrão. Para saber mais, consulte [Desabilitar o endpoint padrão para APIs HTTP](http-api-disable-default-endpoint.md). 

## Pré-requisitos do TLS mútuo
<a name="http-api-mutual-tls-prerequisites"></a>

Para configurar o TLS mútuo, você precisa de:
+ Um nome de domínio personalizado
+ Pelo menos um certificado configurado no AWS Certificate Manager para o seu nome de domínio personalizado
+ Um armazenamento de confiança configurado e carregado no Amazon S3

### Nomes de domínios personalizados
<a name="http-api-mutual-tls-custom-domain-name"></a>

 Para habilitar o TLS mútuo para uma API HTTP, é necessário configurar um nome de domínio personalizado para sua API. Você pode habilitar o TLS mútuo para um nome de domínio personalizado e, depois, fornecer o nome de domínio personalizado aos clientes. Para acessar uma API usando um nome de domínio personalizado que tenha TLS mútuo habilitado, os clientes devem apresentar certificados confiáveis em solicitações de API. Você pode encontrar essas informações em [Nomes de domínio personalizados para APIs HTTP no API Gateway](http-api-custom-domain-names.md).

### Uso de certificados emitidos pelo AWS Certificate Manager
<a name="http-api-mutual-tls-using-acm-issued-certs"></a>

É possível solicitar um certificado publicamente confiável diretamente do ACM ou importar certificados públicos ou autoassinados. Para configurar um certificado no ACM, acesse o [ACM](https://console.aws.amazon.com/acm/). Para importar um certificado, continue lendo na seção a seguir.

### Usar um certificado importado ou Autoridade de Certificação Privada da AWS
<a name="http-api-mutual-tls-non-acm-certs"></a>

Para usar um certificado importado para o ACM ou um certificado do Autoridade de Certificação Privada da AWS com TLS mútuo, o API Gateway precisa de um `ownershipVerificationCertificate` emitido pela ACM. Esse certificado de propriedade é utilizado apenas para verificar você se tem permissões para utilizar o nome de domínio. Ele não é usado para o handshake TLS. Se você ainda não tem um `ownershipVerificationCertificate`, acesse [https://console.aws.amazon.com/acm/](https://console.aws.amazon.com/acm/) para configurar um.

Você precisará manter esse certificado válido durante todo o tempo de vida do seu nome de domínio. Se um certificado expirar e a renovação automática falhar, todas as atualizações do nome de domínio serão bloqueadas. Você precisará atualizar o `ownershipVerificationCertificateArn` com um `ownershipVerificationCertificate` válido antes de poder fazer outras alterações. O `ownershipVerificationCertificate` não pode ser usado como um certificado de servidor para outro domínio de TLS mútuo no API Gateway. Se um certificado for reimportado diretamente para o ACM, o emissor deverá permanecer o mesmo.

### Configuração do armazenamento de confiança
<a name="http-api-mutual-tls-create-trust-store"></a>

Os armazenamentos de confiança são arquivos de texto com extensão `.pem`. Eles são uma lista confiável de certificados de autoridades de certificação. Para usar TLS mútuo, crie um armazenamento confiável de certificados X.509 que podem acessar sua API.

Você deve incluir a cadeia de confiança completa, começando pelo certificado da autoridade de certificação emissora até o certificado CA, em seu armazenamento de confiança. O API Gateway aceita certificados de cliente emitidos por qualquer autoridade de certificação presente na cadeia de confiança. Os certificados podem ser de autoridades de certificação públicas ou privadas. Eles podem ter um tamanho máximo de cadeia de quatro. Você também pode fornecer certificados autoassinados. Os seguintes algoritmos de hash são aceitos no armazenamento de confiança:
+ SHA-256 ou mais forte
+ RSA-2048 ou mais forte
+ ECDSA-256 ou mais forte

O API Gateway valida várias propriedades de certificado. É possível usar autorizadores do Lambda para executar verificações adicionais quando um cliente invoca uma API, incluindo verificar se um certificado foi revogado. O API Gateway valida as seguintes propriedades:


| Validação | Descrição | 
| --- | --- | 
|  Sintaxe X.509  |  O certificado deve atender aos requisitos da sintaxe X.509.  | 
|  Integridade  |  O conteúdo do certificado não pode ter sido alterado do assinado pela autoridade de certificação do armazenamento confiável.  | 
|  Validity  |  O período de validade do certificado deve ser atual.  | 
|  Encadeamento de nomes/encadeamento de chaves  |  Os nomes e os assuntos dos certificados devem formar uma cadeia ininterrupta. Eles podem ter um tamanho máximo de cadeia de quatro.  | 

### Fazer upload do armazenamento de confiança para um bucket do Amazon S3 em um único arquivo
<a name="w2aac19c17b9b9c13"></a>

**Example certificates.pem**  

```
-----BEGIN CERTIFICATE-----
<Certificate contents>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<Certificate contents>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<Certificate contents>
-----END CERTIFICATE-----
...
```

O comando [cp](https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html) da AWS CLI indicado abaixo carrega `certificates.pem` em seu bucket do Amazon S3.

```
aws s3 cp certificates.pem s3://bucket-name
```

## Configurar o TLS mútuo para um nome de domínio personalizado
<a name="http-api-mutual-tls-configure"></a>

Para configurar o TLS mútuo para uma API HTTP, é necessário usar um nome de domínio personalizado regional para sua API, com uma versão do TLS mínima de 1.2. Para saber mais sobre como criar e configurar um nome de domínio personalizado, consulte [Configurar um nome de domínio regional personalizado no API Gateway](apigateway-regional-api-custom-domain-create.md).

**nota**  
O TLS mútuo não é suportado para APIs privadas.

Depois de fazer upload do armazenamento de confiança para o Amazon S3, você pode configurar o nome de domínio personalizado para usar TLS mútuo. O comando [create-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/create-domain-name.html) indicado abaixo cria um nome de domínio personalizado com TLS mútuo:

```
aws apigatewayv2 create-domain-name \
    --domain-name api.example.com \
    --domain-name-configurations CertificateArn=arn:aws:acm:us-west-2:123456789012:certificate/123456789012-1234-1234-1234-12345678 \
    --mutual-tls-authentication TruststoreUri=s3://bucket-name/key-name
```

Depois de criar o nome de domínio, é necessário configurar registros DNS e mapeamentos de caminho base para operações da API. Para saber mais, consulte [Configurar um nome de domínio regional personalizado no API Gateway](apigateway-regional-api-custom-domain-create.md).

## Invocar uma API usando um nome de domínio personalizado que requer TLS mútuo
<a name="http-api-mutual-tls-invoke"></a>

Para invocar uma API com TLS mútuo habilitado, os clientes precisam apresentar um certificado confiável na solicitação de API. Quando um cliente tenta invocar a API, o API Gateway procura o emissor do certificado de cliente no seu armazenamento de confiança. Para que o API Gateway prossiga com a solicitação, o emissor do certificado e a cadeia de confiança completa até o certificado CA raiz devem estar no seu armazenamento de confiança.

O comando `curl` demonstrativo a seguir envia uma solicitação para `api.example.com,` que inclui `my-cert.pem` na solicitação. `my-key.key` é a chave privada para o certificado.

```
curl -v --key ./my-key.key --cert ./my-cert.pem api.example.com
```

Sua API será invocada somente se o seu armazenamento de confiança confiar no certificado. As seguintes condições farão com que o API Gateway falhe no handshake TLS e negue a solicitação com um código de status `403`. Se seu certificado:
+ não é confiável
+ expirou
+ não usa um algoritmo compatível

**nota**  
O API Gateway não verifica se um certificado foi revogado.

## Atualizar o armazenamento de confiança
<a name="http-api-mutual-tls-update-truststore"></a>

Para atualizar os certificados no armazenamento de confiança, faça upload de um novo pacote de certificados para o Amazon S3. Em seguida, você poderá atualizar o nome de domínio personalizado para usar o certificado atualizado.

Use o [Versionamento do Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html) para manter várias versões do armazenamento de confiança. Quando o nome de domínio personalizado é atualizado para usar uma nova versão de armazenamento de confiança, o API Gateway exibirá avisos se os certificados forem inválidos.

O API Gateway produz avisos de certificado somente quando o nome de domínio é atualizado. O API Gateway não o notificará se um certificado carregado anteriormente expirar.

O comando [update-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/update-domain-name.html) indicado abaixo atualiza um nome de domínio personalizado para usar uma nova versão do armazenamento de confiança:

```
aws apigatewayv2 update-domain-name \
    --domain-name api.example.com \
    --domain-name-configurations CertificateArn=arn:aws:acm:us-west-2:123456789012:certificate/123456789012-1234-1234-1234-12345678 \
    --mutual-tls-authentication TruststoreVersion='abcdef123'
```

## Desativar o TLS mútuo
<a name="http-api-mutual-tls-disable"></a>

Para desativar o TLS mútuo para um nome de domínio personalizado, remova o armazenamento de confiança do nome de domínio personalizado, conforme mostrado no comando a seguir.

O comando [update-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/update-domain-name.html) indicado abaixo atualiza um nome de domínio personalizado para remover o armazenamento de confiança do seu nome de domínio personalizado:

```
aws apigatewayv2 update-domain-name \
    --domain-name api.example.com \
    --domain-name-configurations CertificateArn=arn:aws:acm:us-west-2:123456789012:certificate/123456789012-1234-1234-1234-12345678 \
    --mutual-tls-authentication TruststoreUri=''
```

## Solucionar problemas de TLS mútuo para a API HTTP
<a name="http-api-mutual-tls-troubleshooting"></a>

O tópico a seguir fornece orientações para a solução de erros e problemas que você pode encontrar ao ativar o TLS mútuo.

### Solução de problemas de avisos de certificado
<a name="http-api-mutual-tls-troubleshooting-certificate"></a>

 Ao criar um nome de domínio personalizado com TLS mútuo, o API Gateway exibirá avisos se os certificados no armazenamento de confiança não forem válidos. Isso também pode ocorrer ao atualizar um nome de domínio personalizado para usar um novo armazenamento de confiança. Os avisos indicam o problema com o certificado e o assunto que produziu o aviso. O TLS mútuo ainda está habilitado para sua API, mas alguns clientes podem não conseguir acessar a API.

Para identificar o certificado que produziu o aviso, é necessário decodificar os certificados em seu armazenamento de confiança. É possível usar ferramentas como `openssl` para decodificar os certificados e identificar os assuntos.

O comando a seguir exibe o conteúdo de um certificado, incluindo o assunto.

```
openssl x509 -in certificate.crt -text -noout
```

Atualize ou remova os certificados que produziram avisos e, depois, faça upload de um novo armazenamento de confiança para o Amazon S3. Após o upload do novo armazenamento de confiança, atualize o nome de domínio personalizado para usar o novo armazenamento de confiança.

### Solução de problemas de conflitos de nomes de domínios
<a name="w2aac19c17b9c19b7"></a>

O erro `"The certificate subject <certSubject> conflicts with an existing certificate from a different issuer."` significa que mais de uma autoridade de certificação emitiu um certificado para esse domínio. Para cada entidade no certificado, pode haver somente um emissor no API Gateway para domínios do TLS mútuos. Você precisará obter todos os seus certificados para esse assunto por meio de um único emissor. Se o problema for com um certificado sobre o qual você não tem controle, e você é capaz de provar que é o dono do nome de domínio, [entre em contato com Suporte](https://console.aws.amazon.com/support/cases#/create) para abrir um ticket.

### Solução de problemas de mensagens de status de nomes de domínio
<a name="w2aac19c17b9c19b9"></a>

`PENDING_CERTIFICATE_REIMPORT`: isso significa que você reimportou um certificado para o ACM e ele falhou na validação porque o novo certificado tem um SAN (nome alternativo de entidade) que não é coberto pelo `ownershipVerificationCertificate` ou o assunto ou os SANs no certificado não cobrem o nome de domínio. Algo pode estar configurado incorretamente ou um certificado inválido foi importado. Você precisa reimportar um certificado válido para o ACM. Para obter mais informações sobre a validação, consulte [Validação da propriedade de domínios](https://docs.aws.amazon.com/acm/latest/userguide/domain-ownership-validation.html).

`PENDING_OWNERSHIP_VERIFICATION`: isso significa que seu certificado verificado anteriormente expirou e o ACM não conseguiu renová-lo automaticamente. Você precisará renovar o certificado ou solicitar um novo certificado. Mais informações sobre renovação de certificados podem ser encontradas no guia [Solução de problemas de renovação de certificados gerenciados do ACM](https://docs.aws.amazon.com/acm/latest/userguide/troubleshooting-renewal.html).