SSL host header sử dụng Https bindings để host nhiều site dùng SSL

Vấn đề quả trứng và con gà trong SSL bindings

Giả sử bạn có nhu cầu cấu hình 2 site sử dụng port 443 trên cùng một máy chủ chạy IIS như sau

Host Header Value                  IP Address               SSL Port
==============================================
http://www.abc.com                           10.0.1.1                     443
mail.abc.com                                    10.0.1.1                     443

 

Đầu tiên bạn cấu hình hoàn chỉnh site thứ 1 và để chắc ăn bạn cũng đã kiểm tra thử. Tiếp theo bạn cấu hình site thứ 2, tuy nhiên lúc này, bạn sẽ nhận thấy vấn đề là site thứ 2 sẽ không thể chạy được


 Tại sao lại như thế? Để đảm bảo bạn cấu hình đúng, bạn xem lại các bước cấu hình ở site 1 và site 2. Cuối cùng bạn tìm ra rằng, bạn không thể cấu hình hostname cho cả 2 site này.


 Vậy câu hỏi đặt ra ở đây là, tại sao bạn không thể cấu hình hostname? Câu trả lời như sau:

Đầu tiên ta hãy bắt đầu tìm hiểu quá trình kết nối giữa Browser Client và Web server dùng HTTP và HTTPS

Client                                          

HTTP                     

Server                                        

Send request

GET /url HTTP/1.1

Host: http://www.abc.com

  Look for http://www.abc.com, send response

HTTP/1.1 200 OK

content

Display results

sad

Client

HTTPS

Server

Initiate SSL handshake  
  Send server’s SSL certificate
Verify SSL certificate, send request

GET /url HTTP/1.1

Host: http://www.abc.com

 
  Look for http://www.abc.com, send response

HTTP/1.1 200 OK

content

Display results

Bạn có thể thấy để bắt đầu truyền dữ liệu trong giao thức HTTPS thì một kết nối an toàn phải được thiết lập trước đó. Khi truy cập https://www.abc.com

  • Thì một gói tin được mã hóa sẽ gởi về cho Web server. Vì lúc này chỉ có một Site, nên mặc định Site này sẽ được chọn.
  • Web server sẽ dùng Certificate của site để giải mã gói tin và gởi lại cho Client một SSL certificate
  • Client kiểm tra tính hợp lệ của Certificate, nếu hợp lệ thì tiến hành yêu cầu nội dung site
  • Web server sẽ trả về nôi dung site cho Client

Các bước trên là tiến trình hoạt động của giao thức HTTPS đối với trường hợp bạn chỉ có một Site trên Web server. Vậy điều gì sẽ xảy ra nếu như trên Web server bạn có hơn một Site? Khi bạn truy cập vào https://mail.abc.com (chú ý là lúc này bạn có 2 site)

  • Thì một gói tin được mã hóa sẽ gởi về cho Web server. Vì lúc này có 2 Site nên Web server không thể xác định Site nào sẽ được load.
  • Để xác định được Site nào sẽ được load thì cần phải có Hostname/ Host Header. Mà muốn có Hostname/ Host Header thì phải tiến hành giải mã. Mà muốn giải mã thì phải biết được Site nào thì mới dùng chính xác Certificate? Vậy là một vòng lặp xảy ra ở đây.

Và đây chính là lý do mà trên mỗi địa chỉ IP chỉ có thể dùng một Certificate, đồng nghĩa với việc bạn chỉ có thể host được một Site trên cùng một địa chỉ IP sử dùng cùng port.

Kết luận vấn đề

Mỗi SSL certificate chỉ có thể gán với một địa chỉ IP, và bạn không thể host nhiều site dùng SSL trên cùng 1 port và địa chỉ IP.

SSL sẽ mã hóa tất cả dữ liệu truyền giữa trình duyệt (Internet browser) và IIS. Một trong những dữ liệu được mã hóa đó bao gồm cả Host Header mà IIS dùng để xác định site nào sẽ được tải lên cho trình duyệt. Tuy nhiên, certificate cần phải được tải lên để thiết lập kết nối an toàn TRƯỚC khi Head header được gởi đến IIS, vì thế IIS phải chọn certificate dựa trên IP và port number chứ không phải Host Header

 Giải pháp giải quyết vấn đề?

Có một phương pháp đơn giản để giải quyết vấn đề là sử dụng SSL Host Header. Để sử dụng SSL Header bạn sẽ cần một Certificate đại diện cho tất cả Site, hay chính xác là bạn cần một Wildcard Certificate hoặc Unified Communications Certificate.

Nếu các site chỉ là subdomain thì bạn có thể dùng Wildcard Certificate

Nếu các site có domain khác nhau thì bạn phải dùng Unified Communications Certificate hoặc SAN Certificate

  • Thực hiện
    • Như bạn đã biết, ta có ba yếu tố để nhận diện một trang web trong IIS: IP address, Port, Hostname. Ba yếu tố IP:Port:Hostname được gọi là “binding”. 
    • Giả sử binding “192.168.1.1:443:www.abc.com” nghĩa là website đang lắng nghe tại IP 192.168.1.1, port 443 và có host-header là www.abc.com
  • Để SSL Host Header hoạt động bạn cần thực hiện câu lệnh HTTPS BINDINGS như sau:

Tìm hiểu thêm về cơ chế mã hóa của SSL:

1. Client phát sinh 1 Session Key ngẫu nhiên khi truy cập đến Server

2. Client yêu cầu Server gởi Certificate (gồm Public Key của Server)

3. Client kiểm tra tính hợp lệ của Certificate

4. Nếu Certificate của Server hợp lệ, Client mã hóa Session Key bằng Public Key của Server

5. Client gởi Session Key đã mã hóa cho Server

6. Server giải mã Session Key đã được mã hóa bằng Private Key

7. Các thông tin trao đổi giữa server và client sẽ được mã hóa và giải mã bằng Session Key


About Terri

System Administrator @Netpower Datacenter

Posted on 12.05.2013, in Technical Articles, Windows and tagged , , , , , , , . Bookmark the permalink. Leave a comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: