[PKI] Tìm hiểu về Server Name Indication (SNI) hỗ trợ nhiều site HTTPS trên cùng 1 shared IP

Một chủ đề rất là hay trong phân vùng kiến thức về SSL hay PKI, đó là Server Name Indication (SNI) giúp cấu hình nhiều site HTTPS chạy SSL trên cùng 1 shared IP.

1. Vấn đề phát sinh ra SNI ?

Khi hosting nhiều website trên cùng 1 server vật lý, chúng ta thường sử dụng cùng 1 địa chỉ IP public và sử dụng cơ chế named-based virtual hosts của các Web Server nhằm xác định site nào sẽ được xử lý và hiển thị.
Khi trình duyệt web kết nối đến 1 website giả sử có tên miền là “cuongquach.com” trên web server hoạt động nhiều virtual host site. Nó gửi 1 HTTP request đến địa chỉ IP đã được phân giải từ tên miền “cuongquach.com”.
  
Trong gói tin HTTP request có trường header “Host” nhằm chỉ định thông tin tên miền website mà trình duyệt đang muốn truy xuất đến. Lúc này trên server, sau khi nhận được HTTP request này và kiểm tra giá trị HTTP header Host với các giá trị cấu hình tương ứng “Server Name” của các virtual host thì nếu trùng khớp sẽ tiến hành xử lý gói tin truy xuất.
 
Tuy nhiên, cách thức hoạt động này không thể áp dụng đối với các website hoạt động với chứng chỉ số SSL/TLS phương thức HTTPS tiêu chuẩn (tức TLS Protocol standard không có phần mở rộng SNI) được.
 
Nếu sử dụng giao thức TLS tiêu chuẩn không có phần mở rộng cần thiết, web server sẽ không thể lựa chọn đúng thông tin chứng chỉ số SSL tương ứng tên miền hostname của website vì không thể biết được thông tin chứng chỉ số nào mà người dùng đang cần biết và sẽ gửi đến người dùng sai thông tin chứng chỉ số trong quá trình thiết lập SSL/TLS kết nối (ở bước 3 như hình dưới).
tls-handshake
 
Khi đó nếu người dùng phát hiện nhận chứng chỉ số sai thông tin tên miền khi so sánh, trình duyệt sẽ tự động ngừng kết nối đến web server nhằm ngăn chặn 1 trường hợp có khả năng thuộc dạng tấn công Man-In-The-Middle hoặc trình duyệt sẽ xuất thông báo lỗi có vấn đề với chứng chỉ số nhận được từ web server. Bởi vì , các thông tin header “Host” của gói tin HTTP chỉ có thể được gửi đến web server sau quá trình bắt tay TLS (TLS handshake) hoàn tất và kết nối SSL/TLS đã hoàn tất.
 
Lúc này web server chỉ có thể so sánh giá trị hostname trong gói tin HTTP request và quá muộn để lựa chọn đúng chứng chỉ số tương ứng hostname đã sử dụng trong quá trình TLS handshake. Đó cũng là một phần lý do khiến cho chúng ta hay gặp trường hợp 1 web server chỉ có thể phục vụ 1 tên miền hostname tương ứng 1 IP public nếu không sử dụng phần mở rộng SNI. Điều này khiến cho chi phí đội lên tốn kém rất nhiều.
 

Có thể hình dung kịch bản như sau (hình minh hoạ dưới)

– Người dùng muốn truy cập đến website “https://cuongquach.com/” .
– Nhưng web server cấu hình nhiều virtual host hoạt động named-based virtual host không thể lựa chọn được chứng chỉ số của site “https://cuongquach.com/” để gửi đến người dùng cho tới khi hoạt động TLS handshake kết thúc và bắt đầu đọc thông tin header “Host” của gói tin HTTP request từ người dùng gửi tới.
sni1-cuongqc

Đây chính là lúc SNI được sinh ra để giải quyết vấn đề này. Với SNI thì người dùng có thể gửi thông tin chính xác về tên miền (server_name) mà người dùng muốn truy xuất tới web server. Sau đó web server sẽ sử dụng thông tin này để lựa chọn được chứng chỉ số tương ứng website mà người dùng đang truy cập. Chúng ta sẽ đi chi tiết hơn về SNI ở phần sau.
sni2-cuongqc_2


2. Server Name Indication (SNI) ?

Server Name Indication (SNI) là một phần mở rộng của giao thức TLS giúp người dùng (client) cung cấp thông tin hostname tên miền mà người dùng đang muốn truy xuất tới web server nhằm giúp web server cung cấp chính xác chứng chỉ số cho người dùng.
SNI hoạt động ở bước bắt tay TLS (TLS handshake) giữa người dùng và server, trình duyệt sẽ sẽ chèn thêm giá trị hostname (địa chỉ tên miền website) vào trong phần mở rộng của gói tin “Client Hello”, phần mở rộng này có tên là “server_name“. Giúp web server có thể lựa chọn được chứng chỉ số SSL phù hợp.
  
Hình ảnh bắt gói tin về SNI TLS Extension “Client Hello” (nguồn Google.com)
2742.image_708FDEC8

 
Phía server sau khi nhận được gói tin “Client Hello” có chứa trường mở rộng “server_name” sẽ tiến hành sử dụng thông tin trích xuất từ trường mở rộng này nhằm tìm kiếm lựa chọn thông tin chứng chỉ số phù hợp với thông tin tên miền (Server Name) rồi phản hồi về người dùng hoặc phải đi qua các chính sách bảo mật khác. Trong gói tin phản hồi “Server Hello” sẽ bao gồm thông tin server_name của tên miền đó.
 
Trong trường hợp, phía web server quyết định không thể sử dụng thông tin “server_name” của gói tin “Client Hello” để quyết định chọn thông tin chứng chỉ số phù hợp thì trong gói tin “Server Hello” sẽ phản hồi về người dùng thiếu thông tin liên quan hostname tên miền. Coi hình sau để hiểu thêm gói tin phản hồi “Server Hello” thiếu trường thông tin “server_name”.
 
Hình ảnh bắt gói tin về SNI TLS Extension “Server Hello” (nguồn Google.com)

d1muL

 
Sử dụng tính năng SNI, server có thể dễ dàng hoạt động nhiều website với nhiều chứng chỉ số riêng biệt khác nhau, dù tất cả chỉ sử dụng chung 1 địa chỉ IP address.

 
Đặc điểm lưu ý

– SNI được khởi tạo từ phía người dùng (vd: trình duyệt người dùng) nên trình duyệt người dùng phải hỗ trợ tính năng SNI còn không thì sẽ nhận thông báo lỗi nếu kết nối đến Web Server sử dụng nhiều chứng chỉ số trên 1 shared ip.

– SNI phải được hỗ trợ cả phía web server.
– Một số phiên bản cũ của các trình duyệt không hỗ trợ SNI, đây cũng là 1 trong những nhược điểm hiện tại nhưng không quá đáng kể do ngày nay các trình duyệt đều đã hỗ trợ đầy đủ.


Lợi điểm 

– Chúng ta không cần phải tách biệt từng địa chỉ IP với từng chứng chỉ số SSL.
– Thường các nhà cung cấp dịch vụ sẽ giới hạn số lượng tối đa IP đối với 1 server, nên nếu bạn chạy nhiều site sử dụng chứng chỉ số với từng IP riêng lẻ lúc này bạn không có khả năng mở rộng thêm các site chạy SSL.

– Có thể host nhiều website chạy nhiều chứng chỉ số trên cùng 1 địa chỉ shared ip.

Như vậy ta đã tìm hiểu xong phần kiến thức liên quan đến Server Name Indication (SNI).

Previous article[DirectAdmin] Kiểm tra phiên bản các chương trình dịch vụ Direct Admin quản lý
Next article[Linux] Hướng dẫn khoá và mở khoá đăng nhập mật khẩu của tài khoản user trên Linux
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !