Thứ Năm, 6 tháng 8, 2026

Nginx SNI

Nginx SNI
SNI chia làm 2 loại SNI server 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 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
 




Nginx SNI

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 để c...