

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Implementieren Sie den Widerruf von Zertifikaten für gegenseitiges TLS (Viewer) mit Funktionen und CloudFront KeyValueStore
<a name="implement-certificate-revocation"></a>

Sie können CloudFront Verbindungsfunktionen mit verwenden, um die Überprüfung von Zertifikatssperrungen KeyValueStore zu implementieren. Auf diese Weise können Sie eine Liste mit gesperrten Zertifikats-Seriennummern verwalten und die Client-Zertifikate während des TLS-Handshakes mit dieser Liste vergleichen.

Um den Widerruf von Zertifikaten zu implementieren, benötigen Sie die folgenden Komponenten:
+ Eine mit Viewer-MTLS konfigurierte Distribution
+ A, das KeyValueStore die Seriennummern des gesperrten Zertifikats enthält
+ Eine Verbindungsfunktion, die abfragt, KeyValueStore um den Zertifikatsstatus zu überprüfen

Wenn ein Client eine Verbindung herstellt, CloudFront validiert er das Zertifikat anhand des Vertrauensspeichers und führt dann Ihre Verbindungsfunktion aus. Ihre Funktion vergleicht die Seriennummer des Zertifikats mit der KeyValueStore und erlaubt oder verweigert die Verbindung.

**Topics**
+ [Schritt 1: Erstellen Sie eine KeyValueStore für widerrufene Zertifikate](create-kvs-revoked-certificates.md)
+ [Schritt 2: Erstellen Sie die Sperrverbindungsfunktion](create-revocation-connection-function.md)
+ [Schritt 3: Testen Sie Ihre Sperrfunktion](test-revocation-function.md)
+ [Schritt 4: Ordnen Sie die Funktion Ihrer Distribution zu](associate-function-distribution.md)
+ [Erweiterte Sperrszenarien](advanced-revocation-scenarios.md)

# Schritt 1: Erstellen Sie eine KeyValueStore für widerrufene Zertifikate
<a name="create-kvs-revoked-certificates"></a>

Erstellen Sie eine KeyValueStore , um die Seriennummern für gesperrte Zertifikate zu speichern, die Ihre Verbindungsfunktion bei mTLS-Verbindungen überprüfen kann.

Bereiten Sie zunächst die Seriennummern Ihrer widerrufenen Zertifikate im JSON-Format vor:

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

Laden Sie diese JSON-Datei in einen S3-Bucket hoch und erstellen Sie dann: 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"
  }'
```

Warten Sie KeyValueStore , bis die Bereitstellung abgeschlossen ist. Überprüfen Sie den Status mit:

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

# Schritt 2: Erstellen Sie die Sperrverbindungsfunktion
<a name="create-revocation-connection-function"></a>

Erstellen Sie eine Verbindungsfunktion, die die Seriennummern von Zertifikaten anhand von vergleicht KeyValueStore , um festzustellen, ob Zertifikate gesperrt wurden.

Erstellen Sie eine Verbindungsfunktion, die die Seriennummern von Zertifikaten anhand folgender KeyValueStore Werte überprüft:

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

Die Konfigurationsdatei spezifiziert die KeyValueStore Zuordnung:

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

Der Verbindungsfunktionscode überprüft, ob Zertifikate gesperrt wurden: KeyValueStore 

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

# Schritt 3: Testen Sie Ihre Sperrfunktion
<a name="test-revocation-function"></a>

Verwenden Sie die CloudFront Konsole, um Ihre Verbindungsfunktion mit Beispielzertifikaten zu testen. Navigieren Sie in der Konsole zur Verbindungsfunktion und verwenden Sie die Registerkarte Test.

**Testen Sie mit Beispielzertifikaten**

1. Fügen Sie ein Beispielzertifikat im PEM-Format in die Testoberfläche ein

1. Geben Sie optional eine Client-IP-Adresse zum Testen der IP-basierten Logik an

1. Wählen Sie **Testfunktion**, um die Ausführungsergebnisse zu sehen

1. Überprüfen Sie die Ausführungsprotokolle, um Ihre Funktionslogik zu überprüfen

Testen Sie sowohl mit gültigen als auch mit gesperrten Zertifikaten, um sicherzustellen, dass Ihre Funktion beide Szenarien korrekt verarbeitet. Die Ausführungsprotokolle zeigen die Ausgabe von console.log und alle Fehler, die während der Funktionsausführung auftreten.

# Schritt 4: Ordnen Sie die Funktion Ihrer Distribution zu
<a name="associate-function-distribution"></a>

Sobald Sie Ihre Verbindungsfunktion veröffentlicht haben, verknüpfen Sie sie mit Ihrer MTLS-fähigen Distribution, um die Zertifikatssperrüberprüfung zu aktivieren.

Sie können die Funktion auf der Seite mit den Verteilungseinstellungen oder in der Tabelle mit den zugehörigen Verteilungen der Verbindungsfunktion verknüpfen. Navigieren Sie zu Ihren Distributionseinstellungen, scrollen Sie zum Bereich **Viewer Mutual Authentication (mTLS)**, wählen Sie Ihre Verbindungsfunktion aus und speichern Sie die Änderungen.

# Erweiterte Sperrszenarien
<a name="advanced-revocation-scenarios"></a>

Für komplexere Anforderungen an den Widerruf von Zertifikaten sollten Sie die folgenden zusätzlichen Konfigurationen in Betracht ziehen:

**Topics**
+ [Konvertiert Zertifikatssperrlisten (CRL) in ein KeyValueStore Format](#convert-crl-kvs-format)
+ [Behandeln Sie mehrere Zertifizierungsstellen](#handle-multiple-cas)
+ [Fügen Sie benutzerdefinierte Daten zu Verbindungsprotokollen hinzu](#add-custom-data-logs)
+ [CRL-Updates verwalten](#manage-crl-updates)
+ [Kapazität planen KeyValueStore](#plan-kvs-capacity)

## Konvertiert Zertifikatssperrlisten (CRL) in ein KeyValueStore Format
<a name="convert-crl-kvs-format"></a>

Wenn Sie eine CRL-Datei (Certificate Revocation List) haben, können Sie sie mit OpenSSL und jq in das KeyValueStore JSON-Format konvertieren:

**CRL in ein Format umwandeln KeyValueStore **

Extrahieren Sie Seriennummern aus der CRL-Datei:

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

Konvertiere die Seriennummern in das KeyValueStore JSON-Format:

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

Laden Sie die formatierte Datei auf S3 hoch und erstellen Sie KeyValueStore sie wie in Schritt 1 beschrieben.

## Behandeln Sie mehrere Zertifizierungsstellen
<a name="handle-multiple-cas"></a>

Wenn Sie TrustStore mehrere Zertifizierungsstellen (CAs) haben, nehmen Sie die Ausstellerinformationen in Ihre KeyValueStore Schlüssel auf, um Konflikte zwischen Zertifikaten verschiedener Hersteller zu vermeiden CAs , die möglicherweise dieselbe Seriennummer haben.

Verwenden Sie für Szenarien mit mehreren Zertifizierungsstellen eine Kombination aus dem SHA1 Hash des Ausstellers und der Seriennummer als Schlüssel:

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

**Anmerkung**  
Durch die Verwendung von Issuer Identifier \$1 Seriennummer werden längere Schlüssel erzeugt, wodurch sich die Gesamtzahl der Einträge, die Sie darin speichern können, verringern kann. KeyValueStore

## Fügen Sie benutzerdefinierte Daten zu Verbindungsprotokollen hinzu
<a name="add-custom-data-logs"></a>

Verbindungsfunktionen können mithilfe logCustomData dieser Methode benutzerdefinierte Daten zu CloudFront Verbindungsprotokollen hinzufügen. Auf diese Weise können Sie Ergebnisse der Sperrprüfung, Zertifikatsinformationen oder andere relevante Daten in Ihre Protokolle aufnehmen.

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

Benutzerdefinierte Daten sind auf 800 Byte an gültigem UTF-8-Text begrenzt. Wenn Sie diese Grenze überschreiten, werden die Daten bis zur nächsten CloudFront gültigen UTF-8-Grenze gekürzt.

**Anmerkung**  
Die benutzerdefinierte Datenprotokollierung funktioniert nur, wenn Verbindungsprotokolle für Ihre Distribution aktiviert sind. Wenn Verbindungsprotokolle nicht konfiguriert sind, ist die logCustomData Methode ein No-Op.

## CRL-Updates verwalten
<a name="manage-crl-updates"></a>

Zertifizierungsstellen können zwei Arten von CRLs ausstellen:
+ ** CRLsVollständig**: Enthält eine vollständige Liste aller widerrufenen Zertifikate
+ **Delta CRLs**: Listet nur Zertifikate auf, die seit der letzten vollständigen Zertifikatsperrliste gesperrt wurden

Für vollständige CRL-Updates erstellen Sie eine neue KeyValueStore mit den aktualisierten Daten und leiten Sie die Verbindungsfunktionszuordnung auf die neue um. KeyValueStore Dieser Ansatz ist einfacher als das Berechnen von Differenzen und das Durchführen inkrementeller Aktualisierungen.

Verwenden Sie für Delta-CRL-Updates den Befehl update-keys, um den vorhandenen Zertifikaten neue widerrufene Zertifikate hinzuzufügen: KeyValueStore

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

## Kapazität planen KeyValueStore
<a name="plan-kvs-capacity"></a>

KeyValueStore hat eine Größenbeschränkung von 5 MB und unterstützt bis zu 10 Millionen Schlüssel-Wert-Paare. Planen Sie die Kapazität Ihrer Sperrliste auf der Grundlage Ihres Schlüsselformats und Ihrer Datengröße:
+ **Nur Seriennummer**: Effizienter Speicher für einfache Sperrprüfungen
+ **Aussteller-ID \$1 Seriennummer**: Längere Schlüssel für Umgebungen mit mehreren Zertifizierungsstellen

Bei umfangreichen Sperrlisten sollten Sie die Implementierung eines mehrstufigen Ansatzes in Betracht ziehen, bei dem Sie unterschiedliche KeyValueStores Zertifikatskategorien oder Zeiträume verwalten.