

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.

# Révocation du certificat
<a name="certificate-revocation"></a>

Lorsque des certificats doivent être révoqués, en raison de compromissions, de modifications de politique ou de résiliation de relations, vous avez besoin d'un mécanisme permettant de rejeter ces certificats lors de la poignée de main des MTL. CloudFront propose deux approches natives pour la révocation des certificats, que vous pouvez combiner pour un contrôle en couches.
+ **OCSP (Online Certificate Status Protocol)** : CloudFront interroge le répondeur OCSP de votre autorité de certification en temps réel pour vérifier si un certificat client a été révoqué. Activez OCSP sur votre magasin de confiance et gérez la CloudFront validation automatiquement lors de la prise de contact TLS. Les résultats OCSP sont également visibles dans Connection Functions, ce qui vous donne un accès programmatique au statut de révocation pour une prise de décision personnalisée.
+ **CloudFront Fonctions et KeyValueStore** — Vous maintenez une liste des numéros de série des certificats révoqués dans un CloudFront KeyValueStore. Une fonction de connexion interroge le KeyValueStore pendant la prise de contact TLS et autorise ou refuse la connexion. Cela vous donne un contrôle total sur les données de révocation, le calendrier des mises à jour et la logique personnalisée telle que les délais de grâce ou les IP-based exceptions.


**Comparaison : OCSP et CloudFront fonctions avec KeyValueStore**  

|  | OCSP | CloudFront Fonctions \+ KeyValueStore | 
| --- | --- | --- | 
| Source de données | Répondeur OCSP de l'autorité de certification | Vous gérez la liste de révocation | 
| Mécanisme de mise à jour | Real-time requête à CA | Vous envoyez les mises à jour à KeyValueStore | 
| Logique personnalisée | Disponible via les fonctions de connexion | Intégré à votre code de fonction | 
| Dépendance externe | Nécessite la disponibilité du répondeur CA OCSP | Aucune dépendance externe | 
| Idéal pour | CA qui assurent la maintenance des répondeurs OCSP ; état en temps réel CA-authoritative | Self-managed révocation ; politiques personnalisées ; autorités de certification sans support OCSP | 

Vous pouvez utiliser les deux approches ensemble. Activez OCSP pour le contrôle de CA-authoritative révocation, puis utilisez une fonction de connexion pour ajouter une logique supplémentaire au résultat OCSP, par exemple en autorisant les certificats révoqués provenant de plages d'adresses IP fiables pendant une période de grâce.

## OCSP (protocole d'état des certificats en ligne)
<a name="ocsp-revocation"></a>

L'OCSP est un protocole en temps réel qui vérifie le statut de révocation d'un certificat directement auprès de l'autorité de certification (CA). Au cours du processus de signature du certificat, l'autorité de certification intègre une URL de répondeur OCSP dans le certificat. Lorsqu'un client présente son certificat lors de la prise de contact mTLS, CloudFront envoie une demande OCSP à l'URL du répondeur intégré et agit en fonction de la réponse : les certificats valides continuent, les certificats révoqués sont résiliés.

CloudFront valide l'ensemble de la chaîne de certificats (le certificat principal et jusqu'à trois certificats intermédiaires) par rapport à leurs URL de répondeur OCSP respectives. Les certificats racines du trust store sont exclus de la validation OCSP.

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

Activez OCSP sur votre magasin de confiance. Lorsque cette option est activée, effectue CloudFront automatiquement la validation OCSP pour tout certificat client contenant une URL de répondeur OCSP dans son extension Authority Information Access (AIA). Une fois l'OCSP activé, l'ensemble de la chaîne de certificats client doit avoir une URL OCSP. Si un certificat de la chaîne de certificats client ne contient pas d'URL OCSP, la connexion ne CloudFront sera pas établie.

CloudFront met en cache les réponses OCSP à la périphérie afin de réduire le temps d'aller-retour et de se protéger contre les temps d'arrêt du répondeur OCSP. Les réponses OCSP sont mises en cache pendant environ 30 minutes, et le statut de révocation mis à jour peut prendre jusqu'à 30 minutes pour être reflété.

### L'OCSP génère des fonctions de connexion
<a name="ocsp-results-connection-functions"></a>

Lorsqu'une fonction de connexion est configurée sur la même distribution, elle l' CloudFrontinvoque une fois la validation OCSP terminée. L'objet de connexion contient le statut OCSP pour les certificats Leaf et intermédiaire :

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

Le `chainValidity` champ peut être `Valid``Invalid`, ou`Unknown`. Les `status` valeurs de certificat individuelles peuvent être `Good``Revoked`,`Unknown`, ou`Error`. Le `errorType` champ contient `InternalError` ou `OCSP response verification failed: {Type}` lorsque le statut est`Error`.

La fonction de connexion peut annuler le résultat OCSP, par exemple en autorisant un certificat révoqué appartenant à une plage d'adresses IP fiables ou en refusant un certificat que l'OCSP considère comme « bon » sur la base d'une logique métier supplémentaire.

**Note**  
Le `errorType` champ ne sera présent que si le statut l'est`Error`.

### Exemple : gestion OCSP personnalisée avec exception IP sécurisée
<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();
    }
}
```

### Comportement de défaillance de l'OCSP
<a name="ocsp-failure-behavior"></a>

Lorsqu'il est CloudFront impossible de déterminer le statut de révocation d'un certificat (parce que le répondeur OCSP est inaccessible, renvoie une erreur ou renvoie « inconnu »), la connexion est refusée par CloudFront défaut. Pour implémenter un comportement d'échec progressif, utilisez une fonction de connexion. Les fonctions de connexion ne seront pas exécutées si l'OCSP est activé et si l'URL OCSP est absente des certificats clients. Le résultat OCSP est disponible dans l'objet de connexion, et votre fonction peut autoriser les connexions lorsque le statut OCSP est indéterminé :

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

## Révocation du certificat avec CloudFront Functions et KeyValueStore
<a name="kvs-revocation"></a>

Vous pouvez utiliser les fonctions de CloudFront connexion KeyValueStore pour implémenter la vérification de révocation des certificats sans aucune dépendance externe. Vous conservez une liste des numéros de série des certificats révoqués dans un KeyValueStore, et votre fonction de connexion compare chaque certificat client à cette liste lors de la prise de contact TLS.

Le processus de révocation des certificats se déroule comme suit :

1. Stockez les numéros de série des certificats révoqués dans un CloudFront KeyValueStore.

1. Lorsqu'un client présente un certificat, votre fonction de connexion est invoquée.

1. La fonction compare le numéro de série du certificat au KeyValueStore.

1. Si le numéro de série se trouve dans le magasin, le certificat est révoqué.

1. Votre fonction refuse la connexion pour les certificats révoqués.

Cette approche permet de vérifier les révocations en temps quasi réel sur CloudFront le réseau périphérique mondial.

Pour mettre en œuvre cette approche, vous devez :
+ 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.

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

Préparez 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="step2-create-revocation-function"></a>

Créez une fonction de connexion qui vérifie les numéros de série des certificats par rapport aux éléments KeyValueStore suivants :

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

Exemple de code de fonction de connexion :

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

### Étape 3 : Testez votre fonction de révocation
<a name="step3-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.
+ Collez un exemple de certificat au format PEM dans l'interface de test.
+ Spécifiez éventuellement une adresse IP client pour tester IP-based la logique.
+ Choisissez **la fonction Test** pour voir les résultats de l'exécution.
+ 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.

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

Une fois que vous avez publié votre fonction de connexion, associez-la à votre TLS-enabled distribution m pour activer le contrôle de révocation des certificats. Accédez à vos paramètres de distribution, accédez à la section « Authentification mutuelle des spectateurs (mTLS) », sélectionnez votre fonction de connexion et enregistrez les modifications.

## Stratégies de révocation avancées
<a name="advanced-revocation-strategies"></a>

### Combinez l'OCSP avec la logique de la fonction de connexion
<a name="combine-ocsp-kvs"></a>

Vous pouvez activer OCSP pour la vérification des CA-authoritative révocations et ajouter une fonction de connexion par-dessus pour des politiques personnalisées. La fonction de connexion reçoit le résultat OCSP et peut appliquer une logique supplémentaire :
+ **Périodes de grâce** : autorisez les certificats révoqués sur les réseaux internes pendant une période définie lors de la rotation des certificats.
+ **Accès d'urgence** : autorisez les connexions à partir d'adresses IP spécifiques même lorsque l'OCSP signale un statut révoqué.
+ **Logique de refus personnalisée** : bloquez les certificats que l'OCSP considère comme « bons » sur la base de vos propres données de révocation. KeyValueStore

**Example Révocation combinée 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();
}
```

Ce modèle permet une révocation immédiate via KVS (aucun délai de cache) ainsi qu'une CA-authoritative révocation via OCSP, avec une gestion personnalisée des exceptions entre les deux.