Skip to main content

SNI - giải pháp chạy nhiều SSL/TLS cert trên cùng 1 IP

Câu hỏi: có thể chạy nhiều trang web (khác domain) dùng HTTPS trên cùng 1 host không?
Câu chuyện: nhà nghèo phải host nhiều site trên cùng 1 host mà mỗi site cần một SSL/TLS cert thì phải làm sao?
Trả lời: SNI - Server Name Indication
Làm sao dùng được SNI:
kiểm tra xem webserver có hỗ trợ SNI không, phiên bản OpenSSL đã hỗ trợ SNI chưa.

Tại thời điểm hiện tại thì câu trả lời cơ bản là có:
# nginx -V
nginx version: nginx/1.7.9
built by gcc 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
TLS SNI support enabled
...
các phiên bản openssl từ 0.9.8j trở lên đều mặc định hỗ trợ SNI. Với Ubuntu 14.04, không cần phải lo nghĩ về chuyện này:
$ openssl version
OpenSSL 1.0.1f 6 Jan 2014
SNI là gì? sao lại cần?


Khi một web browser request đến một domain, nếu website đó được cấu hình sử dụng virtual host (apache) hay server blocks (NGINX), web server sẽ kiểm tra domain được yêu cầu là gì và match với config tương ứng, từ đó trả về kết quả tương ứng với domain được yêu cầu.

client ----[Header: domain.tld]---- DNS--> IP --> HTTP server --  dựa vào header này để chọn khổi config (server block) tương ứng --- response ---> client

Nhưng khi muốn sử dụng HTTPS hay còn gọi là HTTP over SSL/TLS, trước khi request được web server chọn match với phần config nào, nó phải thực hiện bước "SSL/TLS handshake". Để biết cert của server có đúng không, HTTP client (web browser,...) sẽ kiểm tra server name trong certificate mà web server trả về khi thực hiện handshake có trùng với tên domain trong URL được request không.
Webserver khi nhận được yêu cầu SSL/TLS handshake sẽ trả về certificate mặc định nó được cấu hình, do nó không biết client đang yêu cầu truy cập đến domain name nào. Thông tin domain name trong HTTP header chỉ tồn tại sau khi quá trình SSL/TLS handshake thực hiện thành công.

Để TLS client biết tên server nó sẽ connect đến, và phía server chọn cert phù hợp để trả về, người ta mở rộng TLS sử dụng extension có tên Server Name Indicator - SNI (xem RFC), cho phép chỉ định server mà client đang connect đến khi thực hiện TLS handshake.

Để sử dụng SNI, cần sự kết hợp giữa cả 2 phía client-server. Các browser hiện đại đều hỗ trợ SNI, các webserver cũng vậy.

Tham khảo:
http://nginx.org/en/docs/http/configuring_https_servers.html#sni


Comments

Popular posts from this blog

Tài liệu và hướng dẫn học Python

Để tiết kiệm thời gian, tốt nhất là đi học PyMI Updated: 130617 Sau đây là các tài liệu khuyên dùng: Vì nhiều lý do, nên học python2.7 tại thời điểm hiện tại (giờ là tháng 6/2013 - muốn biết tại sao thì tự tìm hiểu) python 3.5+ (giờ là tháng 2/2017) Chuẩn bị: 1. biết bật tắt máy 2. biết cài python 3. tập gõ 10 ngón - gõ 2 ngón hay 1 ngón cũng không sao, nhưng 10 ngón là cách dễ nhất để gõ nhanh nhất. Tài liệu - Nên dùng tài liệu tại trang chủ của Python làm chính, tham khảo thêm các tài liệu khác tại http://www.familug.org/2016/12/free-ebook.html Căn bản, mới học 1.1 Python PyMI.vn https://pymi.vn/tutorial/ 1.2. Python offical tutorial kết hợp làm bài tập trên HackerRank  (đề bài bằng tiếng Anh, nhưng Google translate 1 lúc cũng ra vì có nhiều ví dụ mẫu đi kèm). Học viên của Pymi.vn có rất nhiều học viên đã tự học với Learn Python the hard way nhưng chưa thấy ai thành công cả. Hai link dưới nên đọc sau khi đã nắm được những phần cơ bản của ngôn ngữ pytho...

The PyMiers

New FAMILUG