

# Revogação de certificados
<a name="certificate-revocation"></a>

Quando os certificados precisam ser revogados — devido a comprometimentos, mudanças de política ou relacionamentos terminados —, você precisa de um mecanismo para rejeitar esses certificados durante o handshake do mTLS. O CloudFront fornece duas abordagens nativas para a revogação de certificados, e você pode combiná-las para um controle em camadas.
+ **OCSP (Online Certificate Status Protocol)** — O CloudFront consulta o respondente OCSP da Autoridade de Certificação em tempo real para verificar se um certificado de cliente foi revogado. Ative o OCSP em seu repositório confiável e o CloudFront gerenciará a validação automaticamente durante o handshake TLS. Os resultados do OCSP também são visíveis nas Funções de Conexão, oferecendo acesso programático ao status de revogação para tomada de decisão personalizada.
+ **CloudFront Functions** e KeyValueStore — Você mantém uma lista de números de série de certificados revogados em um KeyValueStore do CloudFront. Uma função de conexão consulta o KeyValueStore durante o handshake TLS e permite ou nega a conexão. Isso confere controle total sobre os dados de revogação, o tempo de atualização e a lógica personalizada, como períodos de carência ou exceções baseadas em IP.


**Comparação: OCSP versus CloudFront Functions com KeyValueStore**  

|  | OCSP | CloudFront Functions \+ KeyValueStore | 
| --- | --- | --- | 
| Fonte de dados | Respondente OCSP da Autoridade Certificadora | Você gerencia a lista de revogação | 
| Mecanismo de atualização | Consulta em tempo real à CA | Você envia atualizações push para o KeyValueStore | 
| Lógica personalizada | Disponível através do Funções de Conexão | Integrado ao seu código de função | 
| Dependência externa | Requer a disponibilidade do respondente do CA OCSP | Sem dependência externa | 
| Melhor para | CAs que mantêm respondedores OCSP; status de autoridade de CA em tempo real | Revogação autogerenciada; políticas personalizadas; CAs sem suporte a OCSP | 

Você pode usar as duas abordagens em conjunto. Ative o OCSP para verificação de revogação autoritativa da CA e, em seguida, use uma função de conexão para colocar lógica adicional sobre o resultado do OCSP — por exemplo, permitindo certificados revogados de intervalos de IP confiáveis durante um período de carência.

## Online Certificate Status Protocol (OCSP)
<a name="ocsp-revocation"></a>

O OCSP é um protocolo em tempo real que verifica o status de revogação de um certificado diretamente com a Autoridade de Certificação (CA). Durante o processo de assinatura do certificado, a CA incorpora uma URL de resposta OCSP no certificado. Quando um cliente apresenta seu certificado durante o handshake do mTLS, o CloudFront envia uma solicitação OCSP para a URL do respondente incorporado e age de acordo com a resposta: certificados válidos continuam, certificados revogados são terminados.

O CloudFront valida toda a cadeia de certificados — o certificado preliminar e até três certificados intermediários — cada um em relação aos respectivos URLs de resposta do OCSP. Os certificados raiz no repositório confiável são excluídos da validação do OCSP.

### Ativar o OCSP
<a name="enable-ocsp"></a>

Ative o OCSP em sua loja confiável. Quando ativado, o CloudFront executa automaticamente a validação de OCSP para qualquer certificado de cliente contendo uma URL de respondente OCSP em sua extensão de Acesso à Informação de Autoridade (AIA). Depois que o OCSP estiver ativado, toda a cadeia de certificados do cliente deverá ter uma URL OCSP. Se algum certificado na cadeia de certificados do cliente não contiver uma URL OCSP, o CloudFront não estabelecerá a conexão.

O CloudFront armazena em cache as respostas do OCSP na borda para reduzir o tempo de ida e volta e proteger contra o tempo de inatividade do respondente do OCSP. As respostas do OCSP são armazenadas em cache por aproximadamente 30 minutos, e o status de revogação atualizado pode levar até 30 minutos para ser refletido.

### Resultados OCSP em Funções de Conexão
<a name="ocsp-results-connection-functions"></a>

Quando uma função de conexão é configurada na mesma distribuição, o CloudFront a invoca após a conclusão da validação do OCSP. O objeto de conexão contém o status OCSP dos certificados folha e intermediário:

```
{
  "clientCertificate": {
    "certificates": {
      "leaf": {
        "subject": "CN=client.example.com, O=Example Org",
        "issuer": "CN=Intermediate CA, O=Example Org",
        "serialNumber": "00:a7:30:9e:73:7b:3e:63:bd:b7:c0:7e:bf:d5:c9:86",
        "validity": {
          "notBefore": "2024-01-01T00:00:00Z",
          "notAfter": "2025-01-01T00:00:00Z"
        },
        "sha256Fingerprint": "AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90",
        "ocspEndpoint": "http://ocsp.example.org"
      },
      "intermediates": [
        {
          "subject": "CN=Intermediate CA, O=Example Org",
          "issuer": "CN=Root CA, O=Example Org",
          "serialNumber": "00:a7:30:9e:73:7b:3e:63:bd:b7:c0:7e:bf:d5:c9:86",
          "validity": {
            "notBefore": "2020-01-01T00:00:00Z",
            "notAfter": "2030-01-01T00:00:00Z"
          },
          "sha256Fingerprint": "12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF",
          "ocspEndpoint": "http://ocsp.example.org"
        }
      ]
    },
    "revocationStatus": {
      "chainValidity": "Valid",           // "Valid" | "Invalid" | "Unknown"
      "certificates": {
        "leaf": {
          "method": "OCSP",               // "OCSP"
          "status": "Good",               // "Good" | "Revoked" | "Unknown" | "Error"
          "serialNumber": "00:a7:30:9e:73:7b:3e:63:bd:b7:c0:7e:bf:d5:c9:86"
        },
        "intermediates": [
          {
            "method": "OCSP",             // "OCSP"
            "status": "Error",            // "Good" | "Revoked" | "Unknown" | "Error"
            "errorType": "InternalError", // "InternalError" | "OCSP response verification failed: {Type}"
            "serialNumber": "00:a7:30:9e:73:7b:3e:63:bd:b7:c0:7e:bf:d5:c9:86"
          }
        ]
      }
    }
  },
  "clientIp":"127.0.0.1",
  "endpoint":"d123.cloudfront.net",
  "distributionId":"E1NXS4MQZH501R",
  "connectionId":"xdzQ6lJUDUt8b7OuqOD8lmzOC9HcMaXPmhH5ZdzLCZpKxqzfCPpR4A=="
}
```

O campo `chainValidity` pode ser `Valid`, `Invalid` ou `Unknown`. Os valores individuais do certificado `status` podem ser `Good`, `Revoked`, `Unknown` ou`Error`. O campo `errorType` contém `InternalError` ou `OCSP response verification failed: {Type}` quando o status é `Error`.

A função de conexão pode substituir o resultado do OCSP — por exemplo, permitindo um certificado revogado de um intervalo de IP confiável ou negando um certificado que o OCSP relata como “bom” com base em lógica comercial adicional.

**nota**  
O campo `errorType` só estará presente se o status for `Error`.

### Exemplo: tratamento personalizado de OCSP com exceção de IP confiável
<a name="ocsp-example"></a>

```
function connectionHandler(connection) {
    var revocationStatus = connection.clientCertificate.revocationStatus;
    var trustedIP = (connection.clientIp === "[IP_ADDRESS]");

    if (revocationStatus.chainValidity === "Invalid") {
        if (trustedIP) {
            connection.allow();
        } else {
            connection.deny();
        }
    } else if (revocationStatus.certificates.leaf.status === "Error") {
        console.log(revocationStatus.certificates.leaf.errorType);
        connection.deny();
    } else {
        connection.allow();
    }
}
```

### Comportamento de falha do OCSP
<a name="ocsp-failure-behavior"></a>

Quando o CloudFront não consegue determinar o status de revogação de um certificado — porque o respondente OCSP está inacessível, retorna um erro ou retorna “desconhecido” —, o CloudFront nega a conexão por padrão. Para implementar o comportamento de falha suave, use uma função de conexão. As funções de conexão não serão executadas se o OCSP estiver habilitado e a URL do OCSP estiver ausente nos certificados do cliente. O resultado do OCSP está disponível no objeto de conexão, e sua função pode permitir conexões quando o status do OCSP é indeterminado:

```
async function connectionHandler(connection) {
    var revocationStatus = connection.clientCertificate.revocationStatus;

    if (revocationStatus.certificates.leaf.status === "Error" ||
        revocationStatus.certificates.leaf.status === "Unknown") {
        // OCSP responder unreachable — allow connection (soft-fail)
        connection.logCustomData(`OCSP_SOFT_FAIL:${revocationStatus.certificates.leaf.errorType}`);
        return connection.allow();
    }

    if (revocationStatus.chainValidity === "Invalid") {
        return connection.deny();
    }

    return connection.allow();
}
```

## Revogação de certificados com CloudFront Functions e KeyValueStore
<a name="kvs-revocation"></a>

Você pode usar as Funções de Conexão do CloudFront com o KeyValueStore para implementar a verificação de revogação de certificados sem qualquer dependência externa. Você mantém uma lista de números de série de certificados revogados em um KeyValueStore, e sua função de conexão verifica cada certificado do cliente em relação a essa lista durante o handshake TLS.

O processo de revogação de certificados funciona da seguinte maneira:

1. O número de série dos certificados revogados é armazenado em um KeyValueStore do CloudFront.

1. Quando um cliente apresenta um certificado, a função de conexão é invocada.

1. A função compara o número de série do certificado com o número presente no KeyValueStore.

1. Se o número de série for encontrado no armazenamento, o certificado será revogado.

1. A função nega a conexão para certificados revogados.

Essa abordagem oferece uma verificação de revogação quase em tempo real na rede de borda global do CloudFront.

Para implementar essa abordagem, você precisa de:
+ Uma distribuição configurada com mTLS de visualizador.
+ Um KeyValueStore contendo números de série de certificados revogados.
+ Uma função de conexão que consulta o KeyValueStore para verificar o status do certificado.

Quando um cliente se conecta, o CloudFront valida o certificado em relação ao armazenamento confiável e, em seguida, executa a função de conexão. A função compara o número de série do certificado com o número de série no KeyValueStore e permite ou nega a conexão.

### Etapa 1: criar um KeyValueStore para certificados revogados
<a name="step1-create-kvs"></a>

Prepare os números de série de certificados revogados no formato JSON:

```
{
  "data": [
    { "key": "ABC123DEF456", "value": "" },
    { "key": "789XYZ012GHI", "value": "" }
  ]
}
```

Faça upload desse arquivo JSON em um bucket do S3 e, em seguida, crie o KeyValueStore:

```
aws s3 cp revoked-serials.json s3://your-bucket-name/revoked-serials.json

aws cloudfront create-key-value-store \
  --name revoked-serials-kvs \
  --import-source '{
    "SourceType": "S3",
    "SourceARN": "arn:aws:s3:::your-bucket-name/revoked-serials.json"
  }'
```

Aguarde até que o KeyValueStore conclua o provisionamento. Verifique o status com:

```
aws cloudfront get-key-value-store --name "revoked-serials-kvs"
```

### Etapa 2: criar a função de conexão de revogação
<a name="step2-create-revocation-function"></a>

Crie uma função de conexão que compare o número de série dos certificados com os números presentes no KeyValueStore:

```
aws cloudfront create-connection-function \
  --name "revocation-control" \
  --connection-function-config file://connection-function-config.json \
  --connection-function-code file://connection-function-code.txt
```

O arquivo de configuração especifica a associação do KeyValueStore:

```
{
  "Runtime": "cloudfront-js-2.0",
  "Comment": "A function that implements revocation control via KVS",
  "KeyValueStoreAssociations": {
    "Quantity": 1,
    "Items": [
      {
        "KeyValueStoreArn": "arn:aws:cloudfront::account-id:key-value-store/kvs-id"
      }
    ]
  }
}
```

Exemplo de código da função de conexão:

```
import cf from 'cloudfront';

async function connectionHandler(connection) {
    const kvsHandle = cf.kvs();

    // Get client serial number from client certificate
    const clientSerialNumber =
        connection.clientCertificate.certificates.leaf.serialNumber;

    // Check KVS to see if serial number exists as a key
    // Remove : from the clientSerialNumber if KVS entries dont have it
    const serialNumberExistsInKvs =
        await kvsHandle.exists(clientSerialNumber.replaceAll(":", ""));

    // Deny connection if serial number exists in KVS
    if (serialNumberExistsInKvs) {
        console.log("Connection denied — certificate revoked");
        connection.logCustomData("Connection denied — certificate revoked");
        return connection.deny();
    }

    // Allow connections that don't exist in KVS
    console.log("Connection allowed");
    return connection.allow();
}
```

### Etapa 3: testar a função de revogação
<a name="step3-test-revocation-function"></a>

Use o console do CloudFront para testar a função de conexão com certificados de exemplo. Acesse a função de conexão no console e use a guia “Testar”.
+ Cole um certificado de exemplo no formato PEM na interface de teste.
+ Opcionalmente, especifique um endereço IP de cliente para testar a lógica baseada em IP.
+ Selecione **Testar função** para visualizar os resultados da execução.
+ Analise os logs de execução para verificar a lógica de função.

Teste com certificados válidos e revogados para garantir que a função gerencie os dois cenários corretamente.

### Etapa 4: associar a função à distribuição
<a name="step4-associate-function"></a>

Depois de publicar a função de conexão, associe-a à sua distribuição habilitada para mTLS para ativar a verificação de revogação de certificados. Acesse as configurações de distribuição, role até a seção "Autenticação mútua do visualizador (mTLS)", selecione sua função de conexão e salve as alterações.

## Estratégias avançadas de revogação
<a name="advanced-revocation-strategies"></a>

### Combine o OCSP com a lógica da função de conexão
<a name="combine-ocsp-kvs"></a>

Você pode habilitar o OCSP para verificação de revogação autorizada pela CA e adicionar uma função de conexão para políticas personalizadas. A função de conexão recebe o resultado OCSP e pode aplicar lógica adicional:
+ **Períodos de carência** — Permite certificados revogados de redes internas por um período definido durante a rotação de certificados.
+ **Acesso de emergência** — Permite conexões de IPs específicos mesmo quando o OCSP relata o status revogado.
+ **Lógica de negação personalizada** — Bloqueia certificados que o OCSP relata como “bons” com base em seus próprios dados de revogação no KeyValueStore.

**Example Revogação combinada OCSP \+ KVS**  

```
import cf from 'cloudfront';

async function connectionHandler(connection) {
    var kvsHandle = cf.kvs();
    var revocationStatus = connection.clientCertificate.revocationStatus;
    var serialNumber = connection.clientCertificate.certificates.leaf.serialNumber;

    // Check your own revocation list first (immediate revocation, no cache delay)
    var inKvs = await kvsHandle.exists(serialNumber.replaceAll(":", ""));
    if (inKvs) {
        connection.logCustomData("KVS_REVOKED:" + serialNumber);
        return connection.deny();
    }

    // Then check OCSP result
    if (revocationStatus.chainValidity === 'Valid' && revocationStatus.certificates.leaf.status === "Revoked") {
        // OCSP says revoked — allow grace period from trusted IPs
        if (connection.clientIp.startsWith("10.0.")) {
            connection.logCustomData("GRACE_PERIOD:" + serialNumber + ":" + connection.clientIp);
            return connection.allow();
        }
        connection.logCustomData("OCSP_REVOKED:" + serialNumber);
        return connection.deny();
    }

    connection.allow();
}
```

Esse padrão fornece a revogação imediata via KVS (sem atraso no cache), além da revogação autorizada pela CA via OCSP, com tratamento de exceções personalizado no meio.