

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menerapkan pencabutan sertifikat untuk TLS bersama (penampil) dengan Fungsi dan CloudFront KeyValueStore
<a name="implement-certificate-revocation"></a>

Anda dapat menggunakan Fungsi CloudFront Koneksi dengan KeyValueStore untuk menerapkan pemeriksaan pencabutan sertifikat. Ini memungkinkan Anda mempertahankan daftar nomor seri sertifikat yang dicabut dan memeriksa sertifikat klien terhadap daftar ini selama jabat tangan TLS.

Untuk menerapkan pencabutan sertifikat, Anda memerlukan komponen-komponen ini:
+ Distribusi yang dikonfigurasi dengan mTL penampil
+ Sebuah KeyValueStore berisi nomor seri sertifikat yang dicabut
+ Fungsi Koneksi yang menanyakan status sertifikat KeyValueStore untuk memeriksa

Saat klien terhubung, CloudFront validasi sertifikat terhadap trust store, lalu jalankan Fungsi Koneksi Anda. Fungsi Anda memeriksa nomor seri sertifikat terhadap KeyValueStore dan mengizinkan atau menolak koneksi.

**Topics**
+ [Langkah 1: Buat sertifikat KeyValueStore yang dicabut](create-kvs-revoked-certificates.md)
+ [Langkah 2: Buat Fungsi Koneksi Pencabutan](create-revocation-connection-function.md)
+ [Langkah 3: Uji fungsi pencabutan Anda](test-revocation-function.md)
+ [Langkah 4: Kaitkan fungsi ke distribusi Anda](associate-function-distribution.md)
+ [Skenario pencabutan lanjutan](advanced-revocation-scenarios.md)

# Langkah 1: Buat sertifikat KeyValueStore yang dicabut
<a name="create-kvs-revoked-certificates"></a>

Buat KeyValueStore nomor seri sertifikat yang telah dicabut yang dapat diperiksa oleh Fungsi Koneksi Anda selama koneksi mTLS.

Pertama, siapkan nomor seri sertifikat yang telah dicabut dalam format JSON:

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

Unggah file JSON ini ke bucket S3, lalu buat: 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"
  }'
```

Tunggu KeyValueStore hingga penyediaan selesai. Periksa status dengan:

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

# Langkah 2: Buat Fungsi Koneksi Pencabutan
<a name="create-revocation-connection-function"></a>

Buat Fungsi Koneksi yang memeriksa nomor seri sertifikat KeyValueStore untuk menentukan apakah sertifikat dicabut.

Buat Fungsi Koneksi yang memeriksa nomor seri sertifikat terhadap 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
```

File konfigurasi menentukan KeyValueStore asosiasi:

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

Kode Fungsi Koneksi memeriksa sertifikat KeyValueStore yang dicabut:

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

# Langkah 3: Uji fungsi pencabutan Anda
<a name="test-revocation-function"></a>

Gunakan CloudFront konsol untuk menguji Fungsi Koneksi Anda dengan sertifikat sampel. Arahkan ke Fungsi Koneksi di konsol dan gunakan tab Uji.

**Uji dengan sertifikat sampel**

1. Tempelkan sertifikat sampel dalam format PEM ke antarmuka pengujian

1. Secara opsional menentukan alamat IP klien untuk menguji logika berbasis IP

1. Pilih **fungsi Uji** untuk melihat hasil eksekusi

1. Tinjau log eksekusi untuk memverifikasi logika fungsi Anda

Uji dengan sertifikat yang valid dan dicabut untuk memastikan fungsi Anda menangani kedua skenario dengan benar. Log eksekusi menunjukkan output console.log dan kesalahan apa pun yang terjadi selama eksekusi fungsi.

# Langkah 4: Kaitkan fungsi ke distribusi Anda
<a name="associate-function-distribution"></a>

Setelah Anda mempublikasikan Fungsi Koneksi, kaitkan dengan distribusi berkemampuan MTLS untuk mengaktifkan pemeriksaan pencabutan sertifikat.

Anda dapat mengaitkan fungsi dari halaman pengaturan distribusi atau dari tabel distribusi terkait Fungsi Koneksi. Arahkan ke pengaturan distribusi Anda, gulir ke bagian Authentication **Mutual Authentication (mTLS) Viewer**, pilih Fungsi Koneksi Anda, dan simpan perubahannya.

# Skenario pencabutan lanjutan
<a name="advanced-revocation-scenarios"></a>

Untuk persyaratan pencabutan sertifikat yang lebih kompleks, pertimbangkan konfigurasi tambahan ini:

**Topics**
+ [Konversi Daftar Pencabutan Sertifikat (CRL) ke format KeyValueStore](#convert-crl-kvs-format)
+ [Menangani beberapa Otoritas Sertifikat](#handle-multiple-cas)
+ [Tambahkan data khusus ke log koneksi](#add-custom-data-logs)
+ [Kelola pembaruan CRL](#manage-crl-updates)
+ [KeyValueStore Kapasitas rencana](#plan-kvs-capacity)

## Konversi Daftar Pencabutan Sertifikat (CRL) ke format KeyValueStore
<a name="convert-crl-kvs-format"></a>

Jika Anda memiliki file Certificate Revocation List (CRL), Anda dapat mengonversinya ke KeyValueStore format JSON menggunakan OpenSSL dan jq:

**Konversi CRL ke format KeyValueStore **

Ekstrak nomor seri dari file CRL:

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

Konversi nomor seri ke format KeyValueStore JSON:

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

Unggah file yang diformat ke S3 dan buat KeyValueStore seperti yang dijelaskan pada Langkah 1.

## Menangani beberapa Otoritas Sertifikat
<a name="handle-multiple-cas"></a>

Jika Anda TrustStore berisi beberapa Otoritas Sertifikat (CAs), sertakan informasi penerbit dalam KeyValueStore kunci Anda untuk menghindari konflik antar sertifikat dari CAs yang berbeda yang mungkin memiliki nomor seri yang sama.

Untuk skenario multi-CA, gunakan kombinasi SHA1 hash penerbit dan nomor seri sebagai kuncinya:

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

**catatan**  
Menggunakan pengenal penerbit\$1nomor seri membuat kunci yang lebih panjang, yang dapat mengurangi jumlah total entri yang dapat Anda simpan di. KeyValueStore

## Tambahkan data khusus ke log koneksi
<a name="add-custom-data-logs"></a>

Fungsi koneksi dapat menambahkan data khusus ke log CloudFront koneksi menggunakan logCustomData metode ini. Ini memungkinkan Anda menyertakan hasil pemeriksaan pencabutan, informasi sertifikat, atau data relevan lainnya di log Anda.

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

Data kustom dibatasi hingga 800 byte teks UTF-8 yang valid. Jika Anda melebihi batas ini, CloudFront potong data ke batas UTF-8 terdekat yang valid.

**catatan**  
Pencatatan data khusus hanya berfungsi saat log koneksi diaktifkan untuk distribusi Anda. Jika log koneksi tidak dikonfigurasi, logCustomData metode ini adalah no-op.

## Kelola pembaruan CRL
<a name="manage-crl-updates"></a>

Otoritas Sertifikat dapat mengeluarkan dua jenis CRLs:
+ **Lengkap CRLs**: Berisi daftar lengkap semua sertifikat yang dicabut
+ **Delta CRLs**: Hanya sertifikat daftar yang dicabut sejak CRL penuh terakhir

Untuk pembaruan CRL lengkap, buat yang baru KeyValueStore dengan data yang diperbarui dan alihkan asosiasi Fungsi Koneksi ke yang baru. KeyValueStore Pendekatan ini lebih sederhana daripada menghitung perbedaan dan melakukan pembaruan tambahan.

Untuk pembaruan delta CRL, gunakan perintah update-keys untuk menambahkan sertifikat baru yang telah dicabut ke yang sudah ada: KeyValueStore

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

## KeyValueStore Kapasitas rencana
<a name="plan-kvs-capacity"></a>

KeyValueStore memiliki batas ukuran 5 MB dan mendukung hingga 10 juta pasangan nilai kunci. Rencanakan kapasitas daftar pencabutan Anda berdasarkan format kunci dan ukuran data Anda:
+ **Nomor seri saja**: Penyimpanan yang efisien untuk pemeriksaan pencabutan sederhana
+ **Pengidentifikasi penerbit\$1nomor seri**: Kunci yang lebih panjang untuk lingkungan multi-CA

Untuk daftar pencabutan besar, pertimbangkan untuk menerapkan pendekatan berjenjang di mana Anda memelihara terpisah KeyValueStores untuk kategori sertifikat atau periode waktu yang berbeda.