

# Cenários avançados de revogação
<a name="advanced-revocation-scenarios"></a>

Com relação a requisitos de revogação de certificados mais complexos, considere estas configurações adicionais:

**Topics**
+ [Converter listas de revogação de certificados (CRLs) no formato do KeyValueStore](#convert-crl-kvs-format)
+ [Lidar com várias autoridades de certificação](#handle-multiple-cas)
+ [Adicionar dados personalizados aos logs de conexão](#add-custom-data-logs)
+ [Gerenciar atualizações de CRL](#manage-crl-updates)
+ [Planejar a capacidade do KeyValueStore](#plan-kvs-capacity)

## Converter listas de revogação de certificados (CRLs) no formato do KeyValueStore
<a name="convert-crl-kvs-format"></a>

Se você tiver um arquivo de lista de revogação de certificados (CRL), poderá convertê-lo no formato JSON do KeyValueStore usando OpenSSL e jq:

**Converter CRLs no formato do KeyValueStore**

Extraia os números de série do arquivo de CRL:

```
openssl crl -text -noout -in rfc5280_CRL.crl | \
  awk '/Serial Number:/ {print $3}' | \
  cut -d'=' -f2 | \
  sed 's/../&:/g;s/:$//' >> serialnumbers.txt
```

Converta os números de série no formato JSON do KeyValueStore:

```
jq -R -s 'split("\n") | map(select(length > 0)) | {data: map({"key": ., "value": ""})}' \
  serialnumbers.txt >> serialnumbers_kvs.json
```

Faça upload do arquivo formatado no S3 e crie o KeyValueStore conforme descrito na Etapa 1.

## Lidar com várias autoridades de certificação
<a name="handle-multiple-cas"></a>

Quando sua TrustStore contém várias autoridades de certificação (CAs), inclua as informações do emissor nas chaves do KeyValueStore para evitar conflitos entre certificados de CAs diferentes que possam ter o mesmo número de série.

Em cenários com várias CAs, use uma combinação do hash SHA1 do emissor e o número de série como chave:

```
import cf from 'cloudfront';

async function connectionHandler(connection) {
    const kvsHandle = cf.kvs();
    const clientCert = connection.clientCertInfo;
    
    // Create composite key with issuer hash and serial number
    const issuer = clientCert.issuer.replace(/[^a-zA-Z0-9]/g, '').substring(0, 20);
    const serialno = clientCert.serialNumber;
    const compositeKey = `${issuer}_${serialno}`;
    
    const cert_revoked = await kvsHandle.exists(compositeKey);
    
    if (cert_revoked) {
        console.log(`Blocking revoked cert: ${serialno} from issuer: ${issuer}`);
        connection.deny();
    } else {
        connection.allow();
    }
}
```

**nota**  
O uso do identificador do emissor e do número de série cria chaves mais longas, o que pode reduzir o número total de entradas que é possível armazenar no KeyValueStore.

## Adicionar dados personalizados aos logs de conexão
<a name="add-custom-data-logs"></a>

As funções de conexão podem adicionar dados personalizados aos logs de conexão do CloudFront usando o método logCustomData. Isso permite incluir resultados da verificação de revogação, informações do certificado ou outros dados relevantes nos logs.

```
async function connectionHandler(connection) {
    const kvsHandle = cf.kvs();
    const clientSerialNumber = connection.clientCertInfo.serialNumber;
    const serialNumberExistsInKvs = await kvsHandle.exists(clientSerialNumber);
    
    if (serialNumberExistsInKvs) {
        // Log revocation details to connection logs
        connection.logCustomData(`REVOKED:${clientSerialNumber}:DENIED`);
        console.log("Connection denied - certificate revoked");
        return connection.deny();
    }
    
    // Log successful validation
    connection.logCustomData(`VALID:${clientSerialNumber}:ALLOWED`);
    console.log("Connection allowed");
    return connection.allow();
}
```

Os dados personalizados são limitados a 800 bytes de texto UTF-8 válido. Se você exceder esse limite, o CloudFront truncará os dados até o limite UTF-8 válido mais próximo.

**nota**  
O registro em log de dados personalizados só funciona quando os logs de conexão estão habilitados para a distribuição. Se os logs de conexão não estiverem configurados, o método logCustomData não fará nada.

## Gerenciar atualizações de CRL
<a name="manage-crl-updates"></a>

As autoridades de certificação podem emitir dois tipos de CRL:
+ **CRLs completas**: contêm uma lista completa de todos os certificados revogados.
+ **CRLs delta**: listam somente certificados revogados desde a última CRL completa.

Para atualizações de CRLs completas, crie um KeyValueStore com os dados atualizados e redirecione a associação da função de conexão para o novo KeyValueStore. Essa abordagem é mais simples do que calcular diferenças e realizar atualizações incrementais.

Para atualizações de CRLs delta, use o comando update-keys para adicionar novos certificados revogados ao KeyValueStore existente:

```
aws cloudfront update-key-value-store \
  --name "revoked-serials-kvs" \
  --if-match "current-etag" \
  --put file://delta-revoked-serials.json
```

## Planejar a capacidade do KeyValueStore
<a name="plan-kvs-capacity"></a>

O KeyValueStore tem um limite de tamanho total de 5 MB e comporta até 10 milhões de pares de chave-valor. Planeje a capacidade da lista de revogação com base no formato da chave e no tamanho dos dados:
+ **Somente número de série**: armazenamento eficiente para verificação simples de revogação.
+ **Identificador do emissor \$1 número de série**: chaves mais longas para ambientes com várias CAs.

Para listas de revogação extensas, considere a possibilidade de implementar uma abordagem em camadas em que você mantenha os KeyValueStores separados para diferentes categorias de certificado ou períodos.