Load Balancer – SSL Certificates

SSL/TLS

  • Chứng chỉ SSL cho phép mã hóa lưu lượng giữa client và load balancer trong quá trình truyền tải (in-flight encryption)
  • SSL là viết tắt của Secure Sockets Layer, dùng để mã hóa kết nối.
  • TLS là viết tắt của Transport Layer Security, là phiên bản mới hơn.
  • Ngày nay, TLS certificate là loại được sử dụng chủ yếu, nhưng mọi người vẫn quen gọi là SSL.
  • Chứng chỉ SSL public được cấp bởi các tổ chức cấp chứng chỉ (Certificate Authority - CA) Ví dụ: Comodo, Symantec, GoDaddy, GlobalSign, Digicert, LetsEncrypt, v.v.=
  • Chứng chỉ SSL có thời hạn sử dụng (do bạn thiết lập) và phải được gia hạn khi hết hạn.

Load Balancer – SSL Certificates

Luồng mã hóa:

  • Từ phía user đến Load Balancer: HTTPS (encrypted) – truyền qua internet (www)
  • Từ Load Balancer đến EC2 instance: HTTP (không mã hóa) – truyền qua private VPC
  • Load Balancer sử dụng chứng chỉ X.509 (tức là SSL/TLS server certificate)
  • Có thể quản lý chứng chỉ bằng ACM (AWS Certificate Manager) hoặc tự tạo & upload chứng chỉ của bạn (self-managed certificate)

HTTPS listener:

  • Bắt buộc phải chỉ định 1 default certificate
  • Có thể thêm danh sách chứng chỉ bổ sung (để hỗ trợ nhiều domain)
  • Client có thể dùng SNI (Server Name Indication) để chỉ định hostname mà nó muốn kết nối đến
  • Có thể chỉ định security policy để hỗ trợ các phiên bản SSL/TLS cũ hơn (client legacy)

Server Name Indication (SNI)

Đặt vấn đề

Ngày xưa, mỗi domain chạy HTTPS phải dùng một IP riêng biệt, vì trong quá trình SSL handshake, client chưa truyền hostname, nên server không biết request đang muốn truy cập domain nào → không biết dùng SSL cert nào.
Ví dụ:
www.mycorp.com và domain1.example.com đều trỏ về cùng IP → server không phân biệt được nên trả về cert nào.

Giải quyết
  • DNS Layer
    • Bạn vẫn cấu hình mỗi domain (ví dụ www.mycorp.com, domain1.example.com) trỏ về cùng 1 IP public của Load Balancer.
      www.mycorp.com         -> 52.90.XXX.XXX (LB) 
      domain1.example.com    -> 52.90.XXX.XXX (LB)
      ⚠️ Cùng IP — không cần tạo nhiều load balancer hay IP riêng!
  • Client-side SSL Handshake
    • Khi bạn gõ https://www.mycorp.com trên trình duyệt:
      • Client sẽ gửi request đến IP của LB (qua DNS)
      • Trong gói handshake đầu tiên của SSL, client đính kèm thêm hostname (www.mycorp.com) vào (đây chính là SNI field)
      • Load balancer thấy hostname → dùng đúng SSL cert tương ứng
  • Load Balancer xử lý
    • LB đã được cấu hình chứa nhiều cert (via ACM), ví dụ:
      • cert cho www.mycorp.com
      • cert cho domain1.example.com
    • Dựa vào hostname từ SNI, nó:
      • Chọn đúng cert
      • Giải mã HTTPS
      • Route request đến target group tương ứng (tức là backend cho domain đó)
Tổng kết
  • SNI giải quyết vấn đề: cho phép nạp nhiều SSL certificate lên một web server duy nhất (để phục vụ nhiều website khác nhau).
  • Đây là một protocol “mới”, yêu cầu client phải chỉ định hostname của server đích ngay từ bước bắt tay SSL đầu tiên (SSL handshake).
  • Server sau đó sẽ dựa vào hostname được gửi để:
    • Tìm đúng SSL certificate tương ứng
    • Hoặc trả về certificate mặc định nếu không khớp
Ghi chú
  • Chỉ hoạt động với: ALB, NLB (new-gen), CloudFront
  • Không hỗ trợ với: CLB (classic load balancer – old-gen)

So sánh giữa CLB, ALB, NLB về SSL và SNI

LB TypeGenerationSSL cert supportHostname-based routing (SNI)Ghi chú
CLB (Classic Load Balancer)v1 (legacy)❌ Chỉ 1 cert❌ Không hỗ trợ SNINếu cần nhiều domain HTTPS → phải dùng nhiều CLB (tốn chi phí + phức tạp)
ALB (Application Load Balancer)v2✅ Nhiều cert✅ Có SNI → route theo hostnameDành cho HTTP/HTTPS apps, Layer 7
NLB (Network Load Balancer)v2✅ Nhiều cert✅ Có SNI (từ 2018+)Dành cho TCP/TLS/UDP, Layer 4 nhưng vẫn hỗ trợ TLS termination
Bạn thấy bài này thế nào?