

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Implémenter la révocation des certificats pour le TLS mutuel (viewer) avec Functions et CloudFront KeyValueStore
<a name="implement-certificate-revocation"></a>

Vous pouvez utiliser les fonctions de CloudFront connexion KeyValueStore pour implémenter le contrôle de révocation des certificats. Cela vous permet de conserver une liste des numéros de série des certificats révoqués et de vérifier les certificats clients par rapport à cette liste lors de la prise de contact TLS.

Pour implémenter la révocation des certificats, vous avez besoin des composants suivants :
+ Une distribution configurée avec les lecteurs MTL de visualisation
+ A KeyValueStore contenant les numéros de série des certificats révoqués
+ Une fonction de connexion qui interroge le KeyValueStore pour vérifier l'état du certificat

Lorsqu'un client se connecte, CloudFront valide le certificat par rapport au trust store, puis exécute votre fonction de connexion. Votre fonction vérifie le numéro de série du certificat par rapport au KeyValueStore et autorise ou refuse la connexion.

**Topics**
+ [Étape 1 : Création d'un formulaire KeyValueStore pour les certificats révoqués](create-kvs-revoked-certificates.md)
+ [Étape 2 : Création de la fonction de connexion de révocation](create-revocation-connection-function.md)
+ [Étape 3 : Testez votre fonction de révocation](test-revocation-function.md)
+ [Étape 4 : associer la fonction à votre distribution](associate-function-distribution.md)
+ [Scénarios de révocation avancés](advanced-revocation-scenarios.md)

# Étape 1 : Création d'un formulaire KeyValueStore pour les certificats révoqués
<a name="create-kvs-revoked-certificates"></a>

Créez un KeyValueStore pour stocker les numéros de série des certificats révoqués que votre fonction de connexion peut vérifier lors des connexions mTLS.

Préparez d'abord les numéros de série de vos certificats révoqués au format JSON :

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

Téléchargez ce fichier JSON dans un compartiment S3, puis créez 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"
  }'
```

Attendez que le KeyValueStore provisionnement soit terminé. Vérifiez le statut avec :

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

# Étape 2 : Création de la fonction de connexion de révocation
<a name="create-revocation-connection-function"></a>

Créez une fonction de connexion qui vérifie les numéros de série des certificats par rapport KeyValueStore aux afin de déterminer si les certificats sont révoqués.

Créez une fonction de connexion qui vérifie les numéros de série des certificats par rapport aux 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
```

Le fichier de configuration indique l' KeyValueStore association :

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

Le code de la fonction de connexion vérifie la présence KeyValueStore de certificats révoqués :

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

# Étape 3 : Testez votre fonction de révocation
<a name="test-revocation-function"></a>

Utilisez la CloudFront console pour tester votre fonction de connexion à l'aide d'exemples de certificats. Accédez à la fonction de connexion dans la console et utilisez l'onglet Test.

**Test avec des exemples de certificats**

1. Collez un exemple de certificat au format PEM dans l'interface de test

1. Spécifiez éventuellement une adresse IP client pour tester la logique basée sur IP

1. Choisissez **la fonction Test** pour voir les résultats de l'exécution

1. Consultez les journaux d'exécution pour vérifier la logique de votre fonction

Testez avec des certificats valides et révoqués pour vous assurer que votre fonction gère correctement les deux scénarios. Les journaux d'exécution affichent le résultat du fichier console.log et toutes les erreurs survenues lors de l'exécution de la fonction.

# Étape 4 : associer la fonction à votre distribution
<a name="associate-function-distribution"></a>

Une fois que vous avez publié votre fonction de connexion, associez-la à votre distribution compatible MTLS pour activer le contrôle de révocation des certificats.

Vous pouvez associer la fonction depuis la page des paramètres de distribution ou depuis le tableau des distributions associé à la fonction de connexion. Accédez à vos paramètres de distribution, accédez à la section **Authentification mutuelle du visualiseur (mTLS)**, sélectionnez votre fonction de connexion et enregistrez les modifications.

# Scénarios de révocation avancés
<a name="advanced-revocation-scenarios"></a>

Pour des exigences de révocation de certificats plus complexes, envisagez les configurations supplémentaires suivantes :

**Topics**
+ [Convertir les listes de révocation de certificats (CRL) au format KeyValueStore](#convert-crl-kvs-format)
+ [Gérez plusieurs autorités de certification](#handle-multiple-cas)
+ [Ajouter des données personnalisées aux journaux de connexion](#add-custom-data-logs)
+ [Gérer les mises à jour de la CRL](#manage-crl-updates)
+ [KeyValueStore Capacité du plan](#plan-kvs-capacity)

## Convertir les listes de révocation de certificats (CRL) au format KeyValueStore
<a name="convert-crl-kvs-format"></a>

Si vous avez un fichier de liste de révocation de certificats (CRL), vous pouvez le convertir au format KeyValueStore JSON à l'aide d'OpenSSL et de jq :

**Convertir CRL en format KeyValueStore **

Extrayez les numéros de série du fichier CRL :

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

Convertissez les numéros de série au format KeyValueStore JSON :

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

Téléchargez le fichier formaté sur S3 et créez-le KeyValueStore comme décrit à l'étape 1.

## Gérez plusieurs autorités de certification
<a name="handle-multiple-cas"></a>

Lorsque vous avez TrustStore plusieurs autorités de certification (CAs), incluez les informations relatives à l'émetteur dans vos KeyValueStore clés afin d'éviter les conflits entre des certificats provenant de différentes entités CAs susceptibles de porter le même numéro de série.

Pour les scénarios multi-CA, utilisez une combinaison du SHA1 hachage de l'émetteur et du numéro de série comme clé :

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

**Note**  
L'utilisation de l'identifiant de l'émetteur et du numéro de série crée des clés plus longues, ce qui peut réduire le nombre total d'entrées que vous pouvez stocker dans le KeyValueStore.

## Ajouter des données personnalisées aux journaux de connexion
<a name="add-custom-data-logs"></a>

Les fonctions de connexion peuvent ajouter des données personnalisées aux journaux de CloudFront connexion à l'aide de logCustomData cette méthode. Cela vous permet d'inclure les résultats du contrôle de révocation, les informations de certificat ou d'autres données pertinentes dans vos journaux.

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

Les données personnalisées sont limitées à 800 octets de texte UTF-8 valide. Si vous dépassez cette limite, CloudFront tronque les données à la limite UTF-8 valide la plus proche.

**Note**  
L'enregistrement personnalisé des données ne fonctionne que lorsque les journaux de connexion sont activés pour votre distribution. Si les journaux de connexion ne sont pas configurés, la logCustomData méthode est interdite.

## Gérer les mises à jour de la CRL
<a name="manage-crl-updates"></a>

Les autorités de certification peuvent délivrer deux types de CRLs :
+ **Complet CRLs** : contient une liste complète de tous les certificats révoqués
+ **Delta CRLs** : liste uniquement les certificats révoqués depuis la dernière CRL complète

Pour les mises à jour complètes de la CRL, créez-en une nouvelle KeyValueStore avec les données mises à jour et redirigez l'association de la fonction de connexion vers la nouvelle KeyValueStore. Cette approche est plus simple que le calcul des différences et l'exécution de mises à jour incrémentielles.

Pour les mises à jour de la CRL delta, utilisez la commande update-keys pour ajouter de nouveaux certificats révoqués aux certificats existants : KeyValueStore

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

## KeyValueStore Capacité du plan
<a name="plan-kvs-capacity"></a>

KeyValueStore a une limite de taille de 5 Mo et prend en charge jusqu'à 10 millions de paires clé-valeur. Planifiez la capacité de votre liste de révocation en fonction du format de votre clé et de la taille des données :
+ **Numéro de série uniquement** : stockage efficace pour une vérification simple des révocations
+ **Identifiant de l'émetteur et numéro de série** : clés plus longues pour les environnements multi-CA

Pour les listes de révocation volumineuses, envisagez de mettre en œuvre une approche à plusieurs niveaux dans le cadre de laquelle vous maintenez des listes distinctes KeyValueStores pour les différentes catégories de certificats ou périodes.