Episode ini membahas sertifikat custom: konfigurasi certificate file via file provider dengan hot reload, certificate stores dan routing berbasis SNI, serta mutual TLS untuk mengautentikasi klien berbasis sertifikat dengan clientAuthType dan CA file.

Tidak semua sertifikat datang dari Let's Encrypt. Ada kalanya kalian perlu memakai sertifikat dari Certificate Authority internal, sertifikat yang dibeli dari vendor, atau bahkan mengautentikasi klien dengan sertifikat — inilah wilayah episode 17: custom certificates dan mutual TLS (mTLS).
mTLS adalah teknologi yang membuat komunikasi antara dua sistem bisa dipercaya kedua arah. Kalian pernah mengakses internal API yang "mustahil" ditembus? Kemungkinan besar di belakangnya ada mTLS. Di episode ini kita siapkan sertifikat custom dengan OpenSSL, pasang lewat file provider, dan aktifkan autentikasi klien berbasis sertifikat di Traefik.
Untuk lingkungan pengembangan atau CA internal, buat sertifikat dengan OpenSSL:
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout /certs/ca.key -out /certs/ca.crt \
-days 3650 -subj "/CN=Internal CA"
openssl req -newkey rsa:2048 -nodes \
-keyout /certs/service.key -out /certs/service.csr \
-subj "/CN=api.internal.local"
openssl x509 -req -in /certs/service.csr \
-CA /certs/ca.crt -CAkey /certs/ca.key -CAcreateserial \
-out /certs/service.crt -days 825 \
-extfile <(printf "subjectAltName=DNS:api.internal.local,DNS:*.internal.local")Langkah-langkahnya: buat CA, buat certificate signing request (CSR), lalu tanda tangani CSR dengan CA. Flag -extfile menambahkan SAN agar sertifikat valid untuk nama host yang dipakai. Sertifikat yang dihasilkan — service.crt dan service.key — adalah pasangan yang akan dipasang di Traefik.
Sertifikat custom didaftarkan lewat file provider dalam konfigurasi dinamis. Struktur bagian tls dalam file provider:
tls:
certificates:
- certFile: /certs/service.crt
keyFile: /certs/service.key
- certFile: /certs/legacy.crt
keyFile: /certs/legacy.key
stores:
default:
defaultCertificate:
certFile: /certs/service.crt
keyFile: /certs/service.keyKeunggulan file provider: perubahan langsung berlaku tanpa restart. Ganti isi service.crt, Traefik memuat sertifikat baru dalam hitungan detik. Sertifikat kedua di daftar certificates memberi Traefik pilihan tambahan yang akan dipilih berdasarkan SNI request.
Semua sertifikat dikumpulkan di certificate store bernama default. Saat klien melakukan handshake dengan SNI api.internal.local, Traefik mencari sertifikat yang SAN-nya cocok dan menghidangkan yang itu. Tanpa kecocokan, store mengirim defaultCertificate. Untuk routing berbasis SNI di level TCP, kalian juga bisa menunjuk store berbeda per router — pola yang dipakai untuk memisahkan domain internal dan eksternal.
Pada TLS normal, hanya klien yang memverifikasi server. Pada mTLS, dua arah: klien juga wajib menunjukkan sertifikat yang valid, dan Traefik memverifikasinya terhadap daftar CA tepercaya. Hasilnya, hanya mesin dengan sertifikat terbitan CA kalian yang bisa terhubung.
Aktifkan mTLS lewat TLSOption dengan clientAuth:
http:
tlsOptions:
mtls-internal:
clientAuth:
secretNames:
- internal-ca
clientAuthType: RequireAndVerifyClientCertsecretNames: referensi ke Secret berisi CA file di Kubernetes; dalam file provider, caFiles dipakai menggantinya:http:
tlsOptions:
mtls-file:
clientAuth:
caFiles:
- /certs/ca.crt
clientAuthType: RequireAndVerifyClientCertclientAuthType: RequireAndVerifyClientCert: klien wajib mengirim sertifikat dan sertifikatnya harus diverifikasi ke CA.NoClientCert, RequestClientCert, RequireAnyClientCert — masing-masing menurunkan tingkat keketatan.http:
routers:
api-internal:
rule: "Host(`api.internal.local`)"
entrypoints:
- websecure
service: api-svc
tls:
options: mtls-file
certResolver: letsencrypt
services:
api-svc:
loadBalancer:
servers:
- url: "http://10.0.0.70:8080"Sekarang klien yang tidak memiliki sertifikat valid dari CA kalian ditolak di handshake, bahkan sebelum request HTTP dikirim. Kombinasi mTLS + Let's Encrypt seperti di atas menunjukkan dual-use Traefik: enkripsi publik untuk manusia, gerbang sertifikat untuk mesin.
Warning
Pastikan clientAuthType benar-benar RequireAndVerifyClientCert untuk gerbang internal. Nilai RequestClientCert hanya meminta sertifikat tanpa memverifikasi — mudah disalahartikan sebagai proteksi padahal bukan.
Pola ini banyak dipakai untuk:
Inti yang harus dibawa pulang:
clientAuthType: RequireAndVerifyClientCert adalah mode yang sesungguhnya aman.Di episode 18 selanjutnya kita akan membahas TCP & UDP routing — entrypoint TCP, routing berbasis HostSNI, TLS termination versus passthrough untuk protokol non-HTTP, proxying database, SSH, dan SMTP, serta load balancing UDP untuk DNS dan game server. Gerbang kalian sekarang melampaui HTTP.