Belajar Multigress - TLS & HTTPS Termination
Episode 5 of 23

Belajar Multigress - TLS & HTTPS Termination

Episode ini membahas cara menyusun sertifikat TLS dalam Kubernetes secret, mengonfigurasi HTTPS termination pada Gateway, serta TLS passthrough dan kontrol SNI untuk skenario yang membutuhkan enkripsi end-to-end.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Traffic HTTP polos bisa dibaca siapa pun di jaringan. Di produksi, hampir semua traffic masuk harus dienkripsi. Episode 5 membahas TLS & HTTPS termination di Multigress: menyimpan sertifikat sebagai Kubernetes secret, memakai listener HTTPS di Gateway, dan memahami kapan memakai mode passthrough dengan kontrol SNI.

Dua mode penting yang harus kalian pahami: termination, di mana gateway mendekripsi traffic dan mengirim plaintext ke backend, serta passthrough, di mana gateway meneruskan koneksi terenkripsi tanpa membukanya. Keduanya dipakai dalam skenario berbeda.

Menyusun Sertifikat TLS dalam Kubernetes Secret

Membuat Sertifikat Self-Signed untuk Latihan

Untuk latihan, buat sertifikat self-signed dengan openssl:

Generate sertifikat self-signed
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout tls.key -out tls.crt \
  -subj "/CN=api.example.com" \
  -addext "subjectAltName=DNS:api.example.com"

Perintah di atas menghasilkan tls.key dan tls.crt untuk domain api.example.com. Di produksi, ganti dengan sertifikat dari CA tepercaya seperti Let's Encrypt.

Menyimpan dalam Kubernetes Secret

Gateway API hanya menerima secret bertipe kubernetes.io/tls. Buat dan verifikasi:

Buat secret TLS
kubectl create secret tls api-tls \
  --key tls.key --cert tls.crt \
  --namespace multigress-system
kubectl get secret api-tls -n multigress-system

Secret api-tls menyimpan tls.crt dan tls.key sebagai kunci data. Perintah kubectl get secret api-tls -n multigress-system sebaiknya ditambah flag -o yaml untuk memastikan struktur data benar, walaupun nilainya terenkripsi base64.

Warning

Gateway dan secret TLS harus berada di namespace yang sama dengan Gateway, bukan namespace aplikasi. HTTPRoute berada di namespace aplikasi, tetapi sertifikat milik listener Gateway.

Konfigurasi HTTPS Termination pada Gateway

Listener HTTPS

Sekarang deklarasikan listener HTTPS yang merujuk ke secret:

Gateway dengan listener HTTPS
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: main-gateway
  namespace: multigress-system
spec:
  gatewayClassName: multigress
  listeners:
    - name: http
      protocol: HTTP
      port: 80
    - name: https
      protocol: HTTPS
      port: 443
      hostname: "*.example.com"
      tls:
        certificateRefs:
          - name: api-tls
            kind: Secret

Perhatikan bagian tls.certificateRefs: ini menghubungkan listener HTTPS ke secret. Field hostname bersifat opsional — jika diisi, listener hanya melayani hostname yang cocok.

Verifikasi Termination

Terapkan dan tes:

Tes HTTPS termination
kubectl apply -f gateway.yaml
curl -k https://localhost:8443/v1 -H "Host: api.example.com"

Gunakan flag -k karena sertifikat self-signed. Kalau respons muncul, berarti gateway sudah men-terminasi TLS dan meneruskan request ke backend. Cek juga status listener:

Cek status listener
kubectl describe gateway main-gateway -n multigress-system

Pada bagian Status harus muncul kondisi Accepted: True dan Ready: True untuk listener HTTPS. Kesalahan umum seperti secret tidak ditemukan akan tercatat di kondisi ResolvedRefs.

TLS Passthrough dan Kontrol SNI

Kapan Memakai Passthrough

Ada skenario di mana gateway tidak boleh membuka traffic: backend yang menangani sertifikatnya sendiri, seperti aplikasi legacy atau regulasi yang mensyaratkan enkripsi end-to-end. Di sinilah passthrough dipakai. Multigress hanya meneruskan byte terenkripsi dan mengarahkan berdasarkan SNI (Server Name Indication) — nama domain yang dikirim klien saat handshake.

TLSRoute untuk Passthrough

Passthrough dinyatakan dengan TLSRoute:

TLSRoute passthrough
apiVersion: gateway.networking.k8s.io/v1
kind: TLSRoute
metadata:
  name: legacy-tls-route
spec:
  parentRefs:
    - name: main-gateway
      namespace: multigress-system
  hostnames:
    - "legacy.example.com"
  rules:
    - backendRefs:
        - name: legacy-app
          port: 443

TLSRoute tidak memiliki konsep path karena koneksi tidak didekripsi — keputusan routing murni berdasarkan SNI. Backend legacy-app harus mendukung TLS sendiri.

Termination vs Passthrough

AspekTerminationPassthrough
Sertifikat di gatewayYaTidak
Routing berdasarkan pathYaTidak, hanya SNI
Enkripsi ke backendBisa plaintextSelalu terenkripsi
Contoh penggunaanAplikasi modernAplikasi legacy, regulasi

Aturan praktis: gunakan termination untuk hampir semua kasus, dan simpan passthrough untuk skenario yang benar-benar membutuhkan.

Penutup

Episode 5 mengamankan jalur masuk traffic kalian: menyimpan sertifikat sebagai secret, mengonfigurasi listener HTTPS dengan certificateRefs, dan memilih antara termination atau passthrough sesuai kebutuhan backend.

Inti yang harus dibawa pulang:

  • Secret TLS bertipe kubernetes.io/tls dan berada di namespace Gateway.
  • Listener HTTPS menghubungkan port 443 dengan tls.certificateRefs.
  • Status listener: Accepted untuk validitas, ResolvedRefs untuk referensi secret.
  • Passthrough memakai TLSRoute dan hanya merutekan berdasarkan SNI.
  • Termination untuk mayoritas kasus; passthrough untuk enkripsi end-to-end.

Di episode 6 selanjutnya kita akan mengelola traffic policy & load balancing — traffic splitting dan weights, retries, timeouts, circuit breakers, request mirroring, serta perilaku load balancing antar service backend. Gateway HTTPS kalian akan menjadi laboratorium untuk semua eksperimen tersebut.