

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Implementa la revoca dei certificati per Mutual TLS (viewer) con funzioni e CloudFront KeyValueStore
<a name="implement-certificate-revocation"></a>

È possibile utilizzare CloudFront Connection Functions con KeyValueStore per implementare il controllo della revoca dei certificati. Ciò consente di mantenere un elenco di numeri di serie dei certificati revocati e di confrontare i certificati client con questo elenco durante l'handshake TLS.

Per implementare la revoca dei certificati, sono necessari questi componenti:
+ Una distribuzione configurata con Viewer MTL
+ A KeyValueStore contenente i numeri di serie dei certificati revocati
+ Una funzione di connessione che interroga KeyValueStore per verificare lo stato del certificato

Quando un client si connette, CloudFront convalida il certificato confrontandolo con il trust store, quindi esegue la funzione di connessione. La tua funzione confronta il numero di serie del certificato con il KeyValueStore e consente o nega la connessione.

**Topics**
+ [Passaggio 1: creare un file KeyValueStore per i certificati revocati](create-kvs-revoked-certificates.md)
+ [Fase 2: Creare la funzione di connessione di revoca](create-revocation-connection-function.md)
+ [Fase 3: Verifica la tua funzione di revoca](test-revocation-function.md)
+ [Fase 4: Associate la funzione alla vostra distribuzione](associate-function-distribution.md)
+ [Scenari di revoca avanzati](advanced-revocation-scenarios.md)

# Passaggio 1: creare un file KeyValueStore per i certificati revocati
<a name="create-kvs-revoked-certificates"></a>

Crea un file KeyValueStore per memorizzare i numeri di serie dei certificati revocati che la Funzione di connessione può controllare durante le connessioni MTL.

Per prima cosa, prepara i numeri di serie dei certificati revocati in formato JSON:

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

Carica questo file JSON in un bucket S3, quindi crea: 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"
  }'
```

Attendi il completamento del KeyValueStore provisioning. Verifica lo stato con:

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

# Fase 2: Creare la funzione di connessione di revoca
<a name="create-revocation-connection-function"></a>

Crea una funzione di connessione che controlli i numeri di serie dei certificati rispetto a quelli KeyValueStore per determinare se i certificati sono stati revocati.

Crea una funzione di connessione che controlli i numeri di serie dei certificati rispetto a: 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
```

Il file di configurazione specifica l' KeyValueStore associazione:

```
{
  "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"
      }
    ]
  }
}
```

Il codice della funzione di connessione verifica la presenza KeyValueStore di certificati revocati:

```
import cf from 'cloudfront';

async function connectionHandler(connection) {
    const kvsHandle = cf.kvs();
    
    // Get parsed client serial number from client certificate
    const clientSerialNumber = connection.clientCertInfo.serialNumber;
    
    // Check KVS to see if serial number exists as a key
    const serialNumberExistsInKvs = await kvsHandle.exists(clientSerialNumber);
    
    // Deny connection if serial number exists in KVS
    if (serialNumberExistsInKvs) {
        console.log("Connection denied - certificate revoked");
        return connection.deny();
    }
    
    // Allow connections that don't exist in kvs
    console.log("Connection allowed");
    return connection.allow();
}
```

# Fase 3: Verifica la tua funzione di revoca
<a name="test-revocation-function"></a>

Usa la CloudFront console per testare la tua funzione di connessione con certificati di esempio. Vai alla funzione di connessione nella console e usa la scheda Test.

**Esegui il test con certificati di esempio**

1. Incolla un certificato di esempio in formato PEM nell'interfaccia di test

1. Specificare facoltativamente un indirizzo IP del client per testare la logica basata su IP

1. Scegli la **funzione Test** per vedere i risultati dell'esecuzione

1. Esamina i registri di esecuzione per verificare la logica della funzione

Esegui test con certificati validi e revocati per assicurarti che la funzione gestisca correttamente entrambi gli scenari. I log di esecuzione mostrano l'output di console.log e tutti gli errori che si verificano durante l'esecuzione della funzione.

# Fase 4: Associate la funzione alla vostra distribuzione
<a name="associate-function-distribution"></a>

Una volta pubblicata la Connection Function, associala alla distribuzione abilitata per MTLS per attivare il controllo della revoca dei certificati.

È possibile associare la funzione dalla pagina delle impostazioni di distribuzione o dalla tabella delle distribuzioni associate alla funzione di connessione. Passa alle impostazioni di distribuzione, scorri fino alla sezione **Viewer Mutual Authentication (mTLS)**, seleziona la funzione di connessione e salva le modifiche.

# Scenari di revoca avanzati
<a name="advanced-revocation-scenarios"></a>

Per requisiti di revoca dei certificati più complessi, considera queste configurazioni aggiuntive:

**Topics**
+ [Converti gli elenchi di revoca dei certificati (CRL) in formato KeyValueStore](#convert-crl-kvs-format)
+ [Gestisci più autorità di certificazione](#handle-multiple-cas)
+ [Aggiungere dati personalizzati ai registri di connessione](#add-custom-data-logs)
+ [Gestisci gli aggiornamenti CRL](#manage-crl-updates)
+ [Pianifica la capacità KeyValueStore](#plan-kvs-capacity)

## Converti gli elenchi di revoca dei certificati (CRL) in formato KeyValueStore
<a name="convert-crl-kvs-format"></a>

Se disponi di un file CRL (Certificate Revocation List), puoi convertirlo in formato KeyValueStore JSON utilizzando OpenSSL e jq:

**Converti CRL in formato KeyValueStore **

Estrai i numeri di serie dal file CRL:

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

Converti i numeri di serie in formato KeyValueStore JSON:

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

Carica il file formattato su S3 e crealo KeyValueStore come descritto nel passaggio 1.

## Gestisci più autorità di certificazione
<a name="handle-multiple-cas"></a>

Se disponi TrustStore di più autorità di certificazione (CAs), includi le informazioni sull'emittente nelle KeyValueStore chiavi per evitare conflitti tra certificati diversi CAs che potrebbero avere lo stesso numero di serie.

Per scenari con più CA, utilizzate come chiave una combinazione dell' SHA1 hash dell'emittente e del numero di serie:

```
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**  
L'utilizzo dell'identificatore emittente \$1 del numero di serie crea chiavi più lunghe, che possono ridurre il numero totale di voci che è possibile memorizzare in. KeyValueStore

## Aggiungere dati personalizzati ai registri di connessione
<a name="add-custom-data-logs"></a>

Le funzioni di connessione possono aggiungere dati personalizzati ai registri di CloudFront connessione utilizzando il logCustomData metodo. Ciò consente di includere i risultati del controllo di revoca, le informazioni sul certificato o altri dati pertinenti nei registri.

```
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();
}
```

I dati personalizzati sono limitati a 800 byte di testo UTF-8 valido. Se superi questo limite, CloudFront tronca i dati fino al limite UTF-8 valido più vicino.

**Nota**  
La registrazione dei dati personalizzata funziona solo quando i registri di connessione sono abilitati per la distribuzione. Se i log di connessione non sono configurati, il logCustomData metodo non è operativo.

## Gestisci gli aggiornamenti CRL
<a name="manage-crl-updates"></a>

Le autorità di certificazione possono emettere due tipi di CRLs:
+ **Completo CRLs**: contiene un elenco completo di tutti i certificati revocati
+ **Delta CRLs**: elenca solo i certificati revocati dall'ultimo CRL completo

Per gli aggiornamenti CRL completi, creane uno nuovo KeyValueStore con i dati aggiornati e reindirizza l'associazione Connection Function al nuovo. KeyValueStore Questo approccio è più semplice rispetto al calcolo delle differenze e all'esecuzione di aggiornamenti incrementali.

Per gli aggiornamenti delta CRL, usa il comando update-keys per aggiungere nuovi certificati revocati a quelli esistenti: KeyValueStore

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

## Pianifica la capacità KeyValueStore
<a name="plan-kvs-capacity"></a>

KeyValueStore ha un limite di dimensione di 5 MB e supporta fino a 10 milioni di coppie chiave-valore. Pianifica la capacità dell'elenco di revoca in base al formato della chiave e alla dimensione dei dati:
+ **Solo numero di serie**: archiviazione efficiente per un semplice controllo delle revoche
+ **Identificatore dell'emittente \$1 numero di serie**: chiavi più lunghe per ambienti con più CA

Per elenchi di revoche di grandi dimensioni, prendi in considerazione l'implementazione di un approccio a più livelli in cui mantieni la separazione KeyValueStores per diverse categorie di certificati o periodi di tempo.