Dengan TLS passthrough, gerbang masuk meneruskan lalu lintas TLS terenkripsi langsung ke layanan backend tanpa mendekripsinya. Layanan backend yang menangani terminasi TLS—bukan gerbang—sehingga sesi TLS tetap utuh dari klien ke server.
Ini berbeda dari terminasi TLS, di mana gerbang mendekripsi lalu lintas sebelum meneruskannya:
| Mode | TLS dihentikan di | Kasus penggunaan |
|---|---|---|
| TLS termination | Ingress gateway | Proxy sidecar disuntikkan; lalu lintas antara gerbang dan sidecar dikirim melalui saluran data mTLS |
| TLS passthrough | Backend service | Proxy sidecar tidak disuntikkan, atau kondisi khusus lainnya memerlukan enkripsi end-to-end tanpa dekripsi perantara |
Catatan: Jika proxy sidecar disuntikkan, seluruh lalu lintas antara ingress gateway dan proxy sidecar dikirim melalui saluran mutual TLS (mTLS). Dalam kasus tersebut, konfigurasikan terminasi TLS pada ingress gateway sebagai gantinya.
TLS passthrough mengandalkan Server Name Indication (SNI) untuk mengarahkan lalu lintas. Klien Anda harus mendukung ekstensi TLS SNI.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Gerbang masuk telah diterapkan. Untuk informasi lebih lanjut, lihat Buat gerbang masuk.
Aplikasi telah diterapkan di kluster yang ditambahkan ke instans ASM. Untuk informasi lebih lanjut, lihat Terapkan aplikasi di kluster ACK yang ditambahkan ke instans ASM.
Nama domain dengan pendaftaran Internet Content Provider (ICP) (
aliyun.comdigunakan sebagai contoh dalam langkah-langkah berikut)kubectl telah dikonfigurasi untuk terhubung ke kluster yang menjalankan gerbang masuk
Langkah 1: Siapkan sertifikat server dan kunci privat
Jika Anda sudah memiliki sertifikat server dan kunci privat untuk sample.aliyun.com, ubah namanya menjadi sample.aliyun.com.crt dan sample.aliyun.com.key, lalu lanjutkan ke Langkah 2.
Jika belum, jalankan perintah openssl berikut untuk menghasilkan sertifikat tanda tangan sendiri untuk pengujian.
Buat otoritas sertifikat root (CA):
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \ -subj '/O=mynginx Inc./CN=aliyun.com' \ -keyout aliyun.root.key -out aliyun.root.crtHasilkan sertifikat server yang ditandatangani oleh CA root:
openssl req -out sample.aliyun.com.csr -newkey rsa:2048 -nodes \ -keyout sample.aliyun.com.key \ -subj "/CN=sample.aliyun.com/O=mynginx sample organization" openssl x509 -req -days 365 \ -CA aliyun.root.crt -CAkey aliyun.root.key -set_serial 0 \ -in sample.aliyun.com.csr -out sample.aliyun.com.crt
Perintah-perintah ini menghasilkan file-file berikut:
| File | Tujuan |
|---|---|
aliyun.root.crt / aliyun.root.key | Sertifikat dan kunci privat CA root |
sample.aliyun.com.crt / sample.aliyun.com.key | Sertifikat server dan kunci privat untuk sample.aliyun.com |
sample.aliyun.com.csr | Permintaan penandatanganan sertifikat (file sementara) |
Langkah 2: Terapkan layanan backend HTTPS
Langkah ini menerapkan layanan backend berbasis NGINX yang menghentikan TLS pada Port 443. Gerbang masuk meneruskan lalu lintas TLS ke layanan ini tanpa dekripsi.
Buat konfigurasi NGINX
Buat file bernama mynginx.conf dengan konten berikut:
events {
}
http {
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
server {
listen 443 ssl;
server_name www.aliyun.com;
ssl_certificate /etc/nginx-server-certs/tls.crt;
ssl_certificate_key /etc/nginx-server-certs/tls.key;
location / {
return 200 'Welcome to aliyun.com without TLS Termination!';
add_header Content-Type text/plain;
}
}
}Buat resource Kubernetes pendukung
Buat ConfigMap untuk menyimpan konfigurasi NGINX:
kubectl create configmap mynginx-configmap --from-file=nginx.conf=./mynginx.confBuat Secret untuk menyimpan sertifikat server dan kunci privat:
kubectl create secret tls nginx-server-certs \ --key sample.aliyun.com.key --cert sample.aliyun.com.crtAktifkan injeksi proxy sidecar otomatis untuk namespace
default. Untuk informasi lebih lanjut, lihat Aktifkan injeksi proxy sidecar otomatis.
Terapkan layanan NGINX
Buat file bernama mynginxapp.yaml dengan konten berikut, lalu jalankan kubectl apply -f mynginxapp.yaml:
Verifikasi layanan backend
Jalankan perintah berikut untuk mengirim permintaan uji dari proxy sidecar ke server NGINX:
kubectl exec -it $(kubectl get pod -l app=mynginxapp -o jsonpath={.items..metadata.name}) \
-c istio-proxy -- curl -v -k --resolve sample.aliyun.com:443:127.0.0.1 https://sample.aliyun.comJika server NGINX berjalan dengan benar, badan respons berisi:
Welcome to aliyun.com without TLS Termination!Langkah 3: Buat Gateway Istio dengan TLS passthrough
Definisikan resource Gateway yang mendengarkan pada Port 443 dan meneruskan lalu lintas TLS ke backend tanpa terminasi.
Masuk ke Konsol ASM.
Pada panel navigasi kiri, pilih Service Mesh > Mesh Management.
Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.
Pada panel navigasi kiri, pilih ASM Gateways > Gateway. Pada halaman yang muncul, klik Create from YAML.
Pilih namespace default dan tempelkan YAML berikut:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: istio-mynginx-customingressgateway spec: selector: istio: ingressgateway # binds to the default ingress gateway servers: - hosts: - 'sample.aliyun.com' port: name: https number: 443 protocol: HTTPS tls: mode: PASSTHROUGH # forward encrypted traffic without terminationKlik Create.
Gateway baru muncul pada halaman Gateway.
Langkah 4: Buat layanan virtual untuk pengarahan TLS
Definisikan VirtualService yang mengarahkan lalu lintas TLS yang sesuai dengan host SNI sample.aliyun.com ke layanan backend.
Masuk ke Konsol ASM.
Pada panel navigasi kiri, pilih Service Mesh > Mesh Management.
Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.
Pada panel navigasi kiri, pilih Traffic Management Center > VirtualService. Pada halaman yang muncul, klik Create from YAML.
Pilih namespace default dan tempelkan YAML berikut:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: istio-mynginx-customvirtualservice spec: hosts: - "sample.aliyun.com" gateways: - istio-mynginx-customingressgateway # reference the Gateway from Step 3 tls: - match: - port: 443 sniHosts: - sample.aliyun.com # route traffic by SNI hostname route: - destination: host: mynginxapp.default.svc.cluster.local # backend service FQDN port: number: 443Klik Create.
VirtualService baru muncul pada halaman VirtualService.
Verifikasi hasil
Dapatkan alamat IP gerbang masuk menggunakan salah satu metode berikut:
Konsol ASM: Lihat Langkah 1 pada Langkah 3 di Gunakan resource Istio untuk mengarahkan lalu lintas ke versi layanan yang berbeda.
kubectl:
kubectl get svc -n istio-system -l istio=ingressgatewayKolom
EXTERNAL-IPmenampilkan alamat IP gerbang.
Kirim permintaan HTTPS melalui gerbang masuk. Ganti
<ingress-gateway-ip>dengan alamat IP dari langkah sebelumnya:curl -v --cacert aliyun.root.crt \ --resolve sample.aliyun.com:443:<ingress-gateway-ip> \ https://sample.aliyun.comOutput yang diharapkan:
Welcome to aliyun.com without TLS Termination!Hal ini mengonfirmasi bahwa lalu lintas TLS melewati gerbang masuk menuju backend NGINX, yang menghentikan TLS dan mengembalikan respons.
Bersihkan
Untuk menghapus resource yang dibuat dalam tutorial ini, jalankan perintah berikut:
kubectl delete gateway istio-mynginx-customingressgateway
kubectl delete virtualservice istio-mynginx-customvirtualservice
kubectl delete service mynginxapp
kubectl delete deployment mynginxapp
kubectl delete secret nginx-server-certs
kubectl delete configmap mynginx-configmap