Nginx SNI
SNI chia làm 2 loại là SNI server và SNI Client
1. Nginx reject non-SNI – server side
# Khối server mặc định để chặn mọi truy cập không khớp SNI,
yêu cầu phải gửi servername sni lên cùng
server {
listen 443 default_server ssl;
listen [::]:443 default_server ssl;
# Từ chối bắt tay SSL ngay lập tức
ssl_reject_handshake on;
}
# Cấu hình website hợp lệ của bạn
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/cert.crt;
ssl_certificate_key /path/to/cert.key;
# ... cấu hình khác
}
2. SNI as client side (forward proxy)
Mặc định, Nginx không tự động gửi SNI khi kết nối với Upstream.
Nếu máy chủ Upstream yêu cầu SNI để trả về chứng chỉ đúng,
bạn bắt buộc phải bật cấu hình Client-side SNI thông qua các
chỉ thị proxy_ssl_server_name và proxy_ssl_name
server {
listen 443 ssl;
server_name proxy.example.com;
ssl_certificate /etc/ssl/certs/proxy.crt;
ssl_certificate_key /etc/ssl/certs/proxy.key;
location / {
# 1. Chuyển tiếp request đến upstream qua HTTPS
proxy_pass https://backend_server;
# 2. BẬT Client-side SNI (Mặc định là off)
proxy_ssl_server_name on;
# 3. Định nghĩa tên miền sẽ gửi trong TLS Handshake đến Upstream
# Thường sử dụng biến $host (tên miền client gửi lên) hoặc một chuỗi cố định như 'backend.com'
proxy_ssl_name $host;
# (Tùy chọn) Đảm bảo Header Host của HTTP cũng trùng khớp với SNI
proxy_set_header Host $host;
}
}
TLS Handshake Flow with SNI