tuanduong122
CCNA, OCA, OCP, CeHv11, CKA, CKS
Thứ Sáu, 28 tháng 8, 2026
Nginx mTLS
Thứ Năm, 6 tháng 8, 2026
Nginx SNI
Thứ Tư, 29 tháng 4, 2026
GatewayAPI collection
# ===Bước 1: Tạo Backend CA & Chứng chỉ cho Ứng dụng=================
# 1. Tạo Backend Root CA độc lập
openssl genrsa -out backend_ca.key 4096
openssl req -x509 -new -nodes -key backend_ca.key -sha256 -days 36500 \
-out backend_ca.crt \
-subj "/CN=BackendRootCA"
# 2. Tạo chứng chỉ Server cho secure-app
openssl genrsa -out secure_app.key 2048
openssl req -new -key secure_app.key \
-out secure_app.csr \
-subj "/C=VN/ST=HaNoi/O=My Company/CN=test.tuan.name.vn"
# 3. Ký chứng chỉ Server bằng Backend Root CA
openssl x509 -req -in secure_app.csr \
-CA backend_ca.crt -CAkey backend_ca.key \
-CAcreateserial -out secure_app.crt \
-days 365 -sha256
# ===Bước 2: Tạo Gateway CA & Chứng chỉ Client cho Gateway=================
# 1. Tạo Gateway Root CA độc lập
openssl genrsa -out gateway_ca.key 4096
openssl req -x509 -new -nodes -key gateway_ca.key -sha256 -days 36500 \
-out gateway_ca.crt \
-subj "/CN=GatewayRootCA"
# 2. Tạo chứng chỉ Client cho Gateway
openssl genrsa -out gateway_client.key 2048
openssl req -new -key gateway_client.key \
-out gateway_client.csr \
-subj "/CN=gateway"
# 3. Ký chứng chỉ Client bằng Gateway Root CA
openssl x509 -req -in gateway_client.csr \
-CA gateway_ca.crt -CAkey gateway_ca.key \
-CAcreateserial -out gateway_client.crt \
-days 365 -sha256
# 1. app-tls-secret:
# Tạo backend secret phía cuối: ( bao gồm cert ,key của backend và gateway_ca.crt của gateway)
kubectl -n infra-gateway26 create secret generic app-tls-secret --from-file=tls.crt=secure_app.crt --from-file=tls.key=secure_app.key --from-file=ca.crt=gateway_ca.crt --dry-run=client -o yaml | kubectl apply -f -
# 2. gateway-presents-this-cert-for-validation
# Chứng chỉ Client của Gateway, dùng để "trình diện" cho Backend (ca.crt) kiểm tra nhằm chứng minh mình là Gateway hợp pháp.
kubectl -n infra-gateway26 create secret tls gateway-presents-this-cert-for-validation --cert=gateway_client.crt --key=gateway_client.key --dry-run=client -o yaml | kubectl apply -f -
# 3. backend-cert #Chú ý backend-cert để cho vào BackendTLSPolicy phải là configmap, không được dùng như secret
# Vị trí nằm ở: Được khai báo trong BackendTLSPolicy của Kubernetes để NGINX Gateway Fabric sử dụng.
# File chứng chỉ của Root CA (backend_ca.crt) của cụm backend.
kubectl -n infra-gateway26 create configmap backend-cert --from-file=ca.crt=backend_ca.crt --dry-run=client -o yaml | kubectl apply -f -
Tạo deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: secure-app
namespace: infra-gateway26
spec:
replicas: 1
selector:
matchLabels:
app: secure-app
template:
metadata:
labels:
app: secure-app
spec:
containers:
- name: secure-app
image: nginxinc/nginx-unprivileged:latest
ports:
- containerPort: 8443
volumeMounts:
- name: secret
mountPath: /etc/nginx/ssl/secret
readOnly: true
- name: config-volume
mountPath: /etc/nginx/conf.d
- name: nginx-config
mountPath: /etc/nginx/
volumes:
- name: secret
secret:
secretName: app-tls-secret
- name: config-volume
configMap:
name: secure-config
- name: nginx-config
configMap:
name: nginx-config
---
apiVersion: v1
kind: Service
metadata:
name: secure-app
namespace: infra-gateway26
spec:
ports:
- port: 8443
targetPort: 8443
protocol: TCP
name: https
selector:
app: secure-app
---
apiVersion: v1
kind: ConfigMap
metadata:
name: secure-config
namespace: infra-gateway26
data:
app.conf: |-
server {
listen 8443 ssl;
listen [::]:8443 ssl;
server_name secure-app.example.com;
default_type text/plain;
ssl_certificate /etc/nginx/ssl/secret/tls.crt;
ssl_certificate_key /etc/nginx/ssl/secret/tls.key;
ssl_client_certificate /etc/nginx/ssl/secret/ca.crt;
ssl_verify_client on;
# Enable access logging
access_log /var/log/nginx/access.log ssl_log;
location / {
return 200 "hello from pod secure-app\n";
}
}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: infra-gateway26
data:
nginx.conf: |
worker_processes auto;
pid /tmp/nginx.pid;
events {
worker_connections 1024;
}
http {
log_format ssl_log '$remote_addr ssl_client_verify=$ssl_client_verify ssl_client_subject=$ssl_client_s_dn';
error_log /var/log/nginx/error.log debug;
include /etc/nginx/conf.d/*.conf;
}
Tạo GW
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: gateway
namespace: infra-gateway26
spec:
gatewayClassName: nginx
listeners:
- name: http
port: 80
protocol: HTTP
Tạo HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: secure-app
namespace: infra-gateway26
spec:
parentRefs:
- name: gateway
sectionName: http
hostnames:
- "test.tuan.name.vn"
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: secure-app
port: 8443
Khi đó gọi sẽ lỗi vì chưa có BackEndTLSPolicies
# curl --resolve test.tuan.name.vn:80:192.168.88.150 http://test.tuan.name.vn
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
Sửa lại gw tại 2 điểm:
Gw phải đưa vào --cert=gateway_client.crt --key=gateway_client.key. Giúp cho backend verify đúng là gw client.
GW phải đưa vào backend_ca.crt để kiểm tra backend destination có đúng không.
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: gateway
namespace: infra-gateway26
spec:
gatewayClassName: nginx
listeners:
- name: http
port: 80
protocol: HTTP
tls:
backend:
clientCertificateRef:
name: gateway-presents-this-cert-for-validation #tương đương proxy_ssl_certificate
kind: Secret
apiVersion: gateway.networking.k8s.io/v1
kind: BackendTLSPolicy
metadata:
name: backend-tls
namespace: infra-gateway26
spec:
targetRefs:
- group: ""
kind: Service
name: secure-app
validation:
hostname: "test.tuan.name.vn"
caCertificateRefs:
- name: backend-cert
group: ''
kind: ConfigMap #Chú ý đây là configmap, không dùng secret
Sau đó thực hiện test lại
curl --resolve test.tuan.name.vn:80:192.168.88.150 http://test.tuan.name.vn
hello from pod secure-app
ESTED-21: BackendTLSPolicy
Việc dùng BackendTLSPolicy là cho trường hợp backend đằng sau có SSL
https://gateway-api.sigs.k8s.io/guides/tls/#using-system-certificates
k create ns app-namespace21
cat << EOF > 21.configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: app-namespace21
data:
nginx.conf: |
server {
listen 80;
server_name localhost;
# Tự động chuyển hướng từ HTTP sang HTTPS (Tùy chọn)
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name test.tuan.name.vn;
ssl_certificate /etc/nginx/ssl/tls.crt;
ssl_certificate_key /etc/nginx/ssl/tls.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
EOF
k apply -f 21.configmap.yaml
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=*.tuan.name.vn/O=Default Certificate"
kubectl -n app-namespace21 create secret tls nginx-ssl-secret --key tls.key --cert tls.crt
cat << EOF > 21.deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: app-namespace21
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
name: http
- containerPort: 443
name: https
volumeMounts:
# Gắn file cấu hình NGINX vào container
- name: config-volume
mountPath: /etc/nginx/conf.d/default.conf
subPath: nginx.conf
# Gắn chứng chỉ SSL từ Secret vào container
- name: ssl-volume
mountPath: /etc/nginx/ssl
readOnly: true
volumes:
- name: config-volume
configMap:
name: nginx-config
- name: ssl-volume
secret:
secretName: nginx-ssl-secret
EOF
k apply -f 21.deployment.yaml
kubectl -n app-namespace21 expose deployment nginx-deployment --name=nginx-service-http --port=80 --target-port=80 --type=ClusterIP
kubectl -n app-namespace21 expose deployment nginx-deployment --name=nginx-service-https --port=443 --target-port=443 --type=ClusterIP
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: external-gateway
namespace: infra-gateway21
spec:
gatewayClassName: nginx
listeners:
- name: http-listener
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: nginx-http-route
namespace: app-namespace21
spec:
parentRefs:
- name: external-gateway
namespace: infra-gateway21
sectionName: http-listener
hostnames:
- "test.tuan.name.vn"
rules:
- backendRefs:
- name: nginx-service-https
port: 443
Lựa chọn 1 trong 2 cách:
CÁCH 1:
# Chú ý cert của deployment nên là cert xịn, nếu cert đểu thì gọi lỗi 502 bad gateway. Vì khi setting là System thì pod sẽ lấy chính CA được public để so sánh cert của backend
apiVersion: gateway.networking.k8s.io/v1
kind: BackendTLSPolicy
metadata:
name: gateway-to-backend-tls
namespace: app-namespace21
spec:
targetRefs:
- group: ""
kind: Service
name: nginx-service-https
validation:
hostname: "test.tuan.name.vn"
wellKnownCACertificates: System
CÁCH 2: Nếu cert là đểu, thì dùng cách này
# CHÚ Ý: BACKEND TLS không được tạo từ Secret, Mà phải được tạo từ configmap
kubectl get secret nginx-ssl-secret -n app-namespace21 -o jsonpath='{.data.tls\.crt}' | base64 -d > ca.crt
kubectl create configmap nginx-ca-cert --from-file=ca.crt=ca.crt -n app-namespace21
---
apiVersion: gateway.networking.k8s.io/v1
kind: BackendTLSPolicy
metadata:
name: nginx-backend-tls-policy
namespace: app-namespace21
spec:
targetRefs:
- group: ""
kind: Service
name: nginx-service-https
validation:
caCertificateRefs:
- group: ""
kind: ConfigMap
name: nginx-ca-cert
hostname: test.tuan.name.vn
Nginx mTLS
A. Nginx as SERVER with mTLS Trong hệ thống nội bộ, ca certificate thường dùng chung cả cho server và client. Nhưng nếu bảo mật hơn, có t...
-
Phần 1 : Cài đặt PrivacyIDEA server Phần 2: Login ubuntu sử dụng OTP token key. Phần 3: Quản lý tập trung ssh-key bằng privacyIDEA....
-
https://learn.kodekloud.com/user/courses/cilium-certified-associate-cca Contents 1. Cài đặt 2 1.1 Cài đặt cilium từ helm .. 2 N...
-
MTLS # ===Bước 1: Tạo Backend CA & Chứng chỉ cho Ứng dụng================= # 1. Tạo Backend Root CA độc lập openssl genrsa -out backe...