Thứ Hai, 19 tháng 2, 2024

HTTPS hoạt động như thế nào?

    Ở bài viết cách hoạt động của mạng của Internet, chúng ta đã phần nào hiểu được cách thức giao tiếp giữa trình duyệt trên một máy tính cá nhân tới một máy chủ dựa vào giao thức HTTP và tầm quan trọng của việc có một kết nối an toàn. Có rất nhiều dữ liệu nhạy cảm mà bạn sẽ sử dụng để truy cập các chức năng trên mạng internet như username/password, thông tin thẻ creditcard, các thông tin cá nhân, message, image... Khi website không có https, các dữ liệu này đều có thể bị nghe lén.
    Trong bài viết này chúng ta sẽ đi vào tìm hiểu sâu hơn cách hoạt động của giao thức HTTPS. Làm thế nào để giao thức HTTPS có thể đảm bảo một kết nối an toàn khi truy cập tới một máy chủ.


 HTTPS là gì?

HTTPS viết tắt của Hyper Text Transfer Protocol Secure (Giao thức truyền tải siêu văn bản bảo mật), đây là giao thức cải tiến hơn của HTTP do có thêm layer cho việc bảo mật. Chúng ta cần tới HTTPS bởi 3 lý do:

  • Privacy - sự riêng tư: Khi dữ liệu được truyền tải trên mạng internet, không ai có thể đọc được dữ liệu của bạn trong khi truyền tải.
  • Integrity - Tính toàn vẹn dữ liệu: Dữ liệu từ điểm này tới điểm khác trên mạng internet cần được đảm bảo tính toàn vẹn, không ai có khả năng chỉnh sửa các dữ liệu này trên đường truyền tải mà không bị phát hiện
  • Identification - Định danh: Website mà bạn đang truy cập chính xác là trang web đó, nói cách khác là kết nối đến máy chủ không bị làm giả. HTTPS thông qua chứng chỉ SSL , sẽ đảm bảo bạn đang kết nối đến đúng máy chủ mà bạn mong muốn.
Chứng chỉ SSL này cần hợp lệ và được cấp bởi một số tổ chức Certificate Authority hợp pháp.

HTTPS bảo vệ dữ liệu như thế nào?

    Trong bài viết trước chúng ta cũng đã đề cập đến khái niệm mã hóa dữ liệu và sự khác nhau về nguyên lý của việc mã hóa dữ liệu bằng mã hóa đồng bộ và mã hóa bất đồng bộ. Vậy thực sự thì HTTPS sử dụng SSL certificate mã hóa dữ liệu bất đồng bộ như thế nào?

Theo dõi bài viết trước tại đây//TODO link đến bài how internet work đoạn kết nối an toàn

    Khi sử dụng một trình duyệt để thực hiện request đến một Server chứa website. Private key được lưu trữ ở phía server và Public key được chia sẻ cho trình duyệt. Bất cứ một trong hai phía gửi hoặc nhận dữ liệu sẽ sử dụng key của mình để mã hóa/ giải mã. Nếu trình duyệt gửi message đến server, trình duyệt sử dụng Public key để mã hóa và gửi đi, Server sẽ sử dụng private key để giải mã. Và ngược lại, khi server trả về kết quả cho trình duyệt, server sử dụng private key để mã hóa, và trình duyệt dùng public key của mình để giải mã. Đây là ý tưởng cơ bản của việc sử dụng keys để thực hiện kết nối an toàn sử dụng giao thức HTTPS.

Quá trình kết nối từ trình duyệt tới máy chủ

    Khi bạn sử dụng trình duyệt truy cập tới sunteco.vn , trình duyệt của bạn giao tiếp với máy chủ lưu trữ website và cả hai bên thành lập một kết nối an toàn để trao đổi dữ liệu, nếu việc quá trình thương lượng với nhau thất bại, trình duyệt sẽ báo lỗi hoặc cảnh báo về kết nối không an toàn. Nếu kết nối an toàn được thành lập, trình duyệt sẽ hiển thị hình chiếc khóa trên thanh địa chỉ. Quá trình  này được gọi là handshake. Sau đây là từng bước trình duyệt bắt tay với server:
  • Clien Hello: Trình duyệt gửi tới server một danh sách các phiên bản SSL/TLS và các giải thuật mà trình duyệt đang hỗ trợ(cipher suite)
  • Server Hello: Server lựa chọn một phiên bản SSL/TLS và giải thuật phù hợp sau đó phản hồi với trình duyệt bằng Certificate, trong đó bao gồm cả Public key, nhờ đó mà trình duyệt có thể xác định định danh của máy chủ có đúng hay không (Identification)
  • Client Key exchange: Trình duyệt kiểm tra Certificate để đảm bảo máy chủ hợp lệ. Trình duyệt generate một "pre-master key", key này sẽ được sử dụng để sinh ra một unique key về sau. Trình duyệt mã hóa "pre-master key" bằng Public key và gửi lại cho Server
  • Change Ciper spec: Server sử dụng Private key để giải mã "pre-master key"
  • Test connection: Trình duyệt sử dụng Public key để mã hóa message và gửi tới server, server sử dụng Private key để đọc message.
Đến đây hai bên đã trao đổi cho nhau các key cần thiết để thực hiện kết nối an toàn và bảo mật. Mọi thứ sẽ được bảo mật cho đến khi kết thúc phiên làm việc

Sự khác nhau giữa HTTPS/SSL/TLS

Nãy giờ chúng ta đã nhắc đến HTTPS, SSL/TLS vậy chúng liện quan tới nhau như thế nào? HTTPS là phiên bản bảo mật của HTTP, trình duyệt và máy chủ sử dụng giao thức HTTP để giao tiếp và trao đổi dữ liệu. Trong khi trao đổi dữ liệu, các dữ liệu được mã hóa bởi SSL/TLS nên giao thức này được gọi là HTTPS, S viết tắt của secured.
    Câu chuyện về SSL/TLS sẽ phức tạp hơn một chút. SSL viết tắt của Secure Sockets Layer. Một giao thức được phát triển bởi Netscape. Phiên bản đầu tiên của SSL không được release, nhưng phiên bản thứ 2 đã được release cùng với trình duyệt Netscape 1.1 vào năm 1995. Sau đó một năm Netscape release phiên bản thứ 3 vì bản thứ hai có một số lỗi nghiêm trọng. Cho đến năm 1999, cuộc chiến về trình duyệt giữa Netscape và Microsoft (internet explore) dẫn đến sự cần thiết của các chuẩn cho trình duyệt. Netscape chuyển giao giao thức SSL cho IETF (Internet Engineering Task Force).
    Cuối năm 1999, IETF release TLS version 1.0 (mà thực ra là SSL 3.1). SSL được đổi tên thành TLS-Transport Layer Security. Dẫn đến việc gây lú cho tới ngày nay. TLS 1.0 kết thúc và bản 1.1 release năm 2006. Vài năm sau TLS 1.2 ra đời để giải quyết một số sai sót. Nhưng đến tận 2013, các trình duyệt mới bắt kịp và hỗ trợ cho TLS 1.2
    Để gây lú x3.14, SSL 3.0 chính thức được release năm 2015. TLS 1.3 được chấp thuận vào tháng 3 năm 2018 và trình duyệt của bạn hiện giờ chắc hẳn đã hỗ trợ. TLS 1.3 cải thiện về bảo mật và loại bỏ một số issue .
Bạn có thể check version TLS của trình duyệt tại đây

Certificate Autorities

Certificate Autority là một tổ chức third-party phục vụ 3 mục đích chính:
  • Cấp certificates
  • Confirm định danh của chủ sở hữu certificate
  • Cung cấp bằng chứng rằng certificate là hợp lệ.
    Chúng ta có thể đã nghe đến Symantec, Comodo, Let's Encrypt, GoDaddy... Trở thành CA là một nhiệm vụ rất khó khăn về yêu cầu bảo mật và kiểm tra. Bạn phải được tin tưởng để có thể được chấp nhận truy cập vào Root store. Root store về cơ bản là cơ sở dữ liệu của các CAs, các CAs sẽ chia sẻ chung với nhau cơ sở dữ liệu này.
    Certificate nào mà bạn nên mua? Về cơ bản bạn có 3 loại cert để lựa chọn:
  • Domain validated: Loại certificate này chỉ xác nhận cho tên miền.
  • Organization validate: Loại cert này yêu cầu thẩm định và xác minh tổ chức cần cấp chứng chỉ một cách manual
  • Extended validation: Cert yêu cầu xác minh đầy đủ về doanh nghiệp.
    Kết quả của các chứng chỉ hợp lệ trên trình duyệt là biểu tượng khóa an toàn trên thanh địa chỉ. Extended validation thường hiển thị thêm công ty đi cùng biểu tượng khóa. Nhưng làm sao để một chứng chỉ hợp lệ?
    Khi CA cấp một certificate, họ sẽ kí vào trong certificate một chữ kí điện tử bằng chứng chỉ gốc của họ đã được cài đặt trước trên root store. Thường là sẽ có một intermediate certificate được kí với bằng root certificate. Và chứng chỉ trung gian này lại được dùng để kí cho các chứng chỉ đầu cuối. 
    Cùng đi qua tiến trình xác minh để hiểu một certificate được xác định hợp lệ như thế nào. Trình duyệt của bạn connect tới một trang web bằng HTTPS và download cert. Cert đó không phải là root cert, trình duyệt tiếp tục download cert mà được dùng để ký cho cert trên trang của bạn truy cập, nhưng cert này vẫn không phải là root cert. Trình duyệt download thêm một lần nữa cert sử dụng để kí cho mid cert. Ya! Đây đúng là root cert rồi. Vậy là tất cả các cert này đều được xác mình và tin cậy. Khi certtificate cuối cùng không phải là root cert, chuỗi xác mình này sẽ thất bại và certificate đầu tiên sẽ không hợp lệ. 
    Vậy tại sao phải sử dụng certificate đến từ Certificate Authotity trong khi bạn có thể tự tạo ra certificate của mình? Một self-sign certificate  cung cấp cùng mức độ mã hóa giống như tổ chức có thẩm quyền. Dữ liệu vẫn được bảo mật khi truyền dẫn và bạn không phải mất phí để gen certificate. Nhưng hầu như các trình duyệt sẽ kiểm tra certificate được cấp bởi các tổ chức có thẩm quyền. Các truy cập vào một website mà cert không phải do CA cấp sẽ bị hiển thị cảnh báo connection insecure.


Self-signed certificate có thể hữu ích cho test và nội bộ, nhưng bạn nên tránh sử dụng cho các trang web public. Do các chứng chỉ tự ký này có thể bị làm giả.

Kết

    Hy vọng bài viết đã làm rõ tầm quan trọng của HTTPS và cách mà một Certificate được sinh ra và được sử dụng để tạo ra một kết nối an toàn trên mạng internet. Trong những bài viết sau, chúng ta sẽ tiến hành thực hiện việc gen certificate để tạo ra một kết nối an toàn cho website đang hosting trên máy chủ.


Tham khảo https://howhttps.works/







Chủ Nhật, 18 tháng 2, 2024

Internet hoạt động như thế nào?

     Chúng ta vẫn đang sử dụng mạng Internet hàng ngày, nhưng có bao giờ bạn đặt câu hỏi về việc một mạng thông tin toàn cầu lớn như vậy được tạo nên như thế nào và có ai đang kiểm soát nó hay không?

Bài viết này sẽ giải đáp các vấn đề cốt lõi như: làm cách nào mà Internet được tạo thành và dữ liệu di chuyển trên Internet như thế nào, dữ liệu di chuyển từ máy tính này đến các máy tính khác ở cách đó rất xa mà vẫn đảm bảo tính toàn vẹn và bảo mật dữ liệu.

Internet là gì?

    Internet là một hệ thống rất lớn các networks và kết nối các máy tính trên toàn thế giới. Qua mạng internet, người ta có thể chia sẻ thông tin và giao tiếp từ nơi này đến nơi khác trên thế giới chỉ với kết nối vào mạng Internet. Kết nối này được tuân theo các chuẩn nhất định để bảo vệ dữ liệu của người dùng.

Dữ liệu di chuyển trên mạng internet như thế nào?

   Nói theo một cách khác, Internet là mạng toàn cầu bao gồm cả các cáp vật lý như dây đồng của đường dây điện thoại, cap tivi hoặc cáp quang. Thậm chí gồm cả các kết nối không dây như tín hiệu vệ tinh, wifi và 3G/4G . Khi bạn truy cập một trang web, bạn gửi yêu cầu qua dây cáp đến một server. Server này là nơi lưu trữ website, đây là một máy chủ vậy lý hoạt động tương tự như máy tính cá nhân của bạn nhưng có thể ở cấp độ lớn hơn rất nhiều. Sau đó máy chủ sẽ xử lý request và trả dữ liệu về máy tính của bạn. Nhưng thật kì diệu, quá trình này thường chỉ mất chưa tới một giây, ngay cả khi Server nằm ở đầu kia của trái đất

Các network nói chuyện với nhau bằng cách nào?

    Vậy bây giờ ta đã hiểu về mặt vật lý, vẫn sẽ có những dây dẫn kết nối giữa các thiết bị trên mạng Internet. Vậy về mặt logic, làm sao dữ liệu có thể đi đúng tới máy server và sau đó trả dữ liệu về đúng máy vừa request mà không phải là một máy khác. Lúc này sẽ là việc của IP và DNS. IP có ý nghĩa như địa chỉ duy nhất của một thiết bị trên mạng Internet và nó có dạng của một dãy số xxx.xxx.xxx.xxx . Khi đã biết địa chỉ, các thiết bị sẽ giao tiếp với nhau thông qua việc tuân thủ các Protocol. Protocol là một bộ các quy tắc tiêu chuẩn mà khi các bên đồng ý sử dụng, nó sẽ cho phép họ giao tiếp mà không gặp rắc rối. Nhưng thông thường thì chúng ta sẽ không truy cập trang web bằng địa chỉ IP , nó khá khó nhớ và nhàm chán. Thay vào đó người ta sử dụng các tên miền có nghĩa, đây là các tên đơn giản được cài đặt để đại diện cho các địa chỉ IP. Nhờ vào DNS (Domain Name System) mà các thiết bị có thể biết được địa chỉ IP của máy chủ từ tên miền. DNS hoạt động như một kho lưu trữ các tên miền cùng với các địa chỉ IP mà chúng đại diện, và khi các thiết bị muốn biết IP mà tên miền đại diện, DNS sẽ giải quyết vấn đề này.

Để hiểu thêm về cách thức hoạt động của DNS, xem thêm: DNS hoạt động như thế nào?

Packets, Routing và sự tin cậy


    Khi bạn download dữ liệu, bạn có thể nhìn thấy thanh tiến trình đầy dần cho đến khi tất cả dữ liệu đến được máy tính của bạn. Liệu những dữ liệu này có đến cùng một lúc và di chuyển trên cùng một con đường hay không? Câu trả lời là không. Đây chính là cách truyền tải dữ liệu cơ bản của Internet: dữ liệu gốc được chia nhỏ ra thành các gói tin(Packets) theo các giao thức tin cậy, sau đó được gửi qua mạng internet qua nhiều tuyến đường khác nhau. Giống như cách chúng ta di chuyển giữa các tuyến đường, nếu như biết tuyến đường này bị tắc, ta sẽ chuyển hướng sang một con đường khác, có thể sẽ dài hơn về mặt khoảng cách  nhưng sẽ nhanh hơn về mặt thời gian. Những gói tin này không tự chọn đường đi cho mình, mỗi gói tin sẽ có địa chỉ nơi nó đi và nơi nó cần đến. 
    Một số các máy tính đặc biệt trên mạng internet mang tên định tuyến (Router) đóng vai trò như người điều phối giao thông, đảm bảo các gói tin di chuyển thông suốt trên mạng. Nếu một tuyến đường bị nghẽn, các gói tin đơn lẻ có thể đi đường khác. Mỗi định tuyến sẽ theo dõi nhiều đường dẫn để gửi gói tin và chọn đường dẫn phù hợp, tối ưu nhất cho gói tin dựa trên địa chỉ IP cần đến. Tối ưu ở đây bao gồm cả về chi phí, thời gian, cũng có thể là chính trị hoặc quan hệ giữa các công ty, thậm chí do người quản trị cài đặt điều hướng. 
    Vậy những router này thuộc về ai? Tại mỗi điểm giao nhau giữa các network sẽ có ít nhất một router. Tại những nơi network lớn giao nhau, có rất nhiều router để đảm bảo sự ổn định. Càng nhiều router thì độ ổn định càng cao. Vậy nên router sẽ thuộc về cá nhân/ tổ chức nào quản lý network đó. Ở cấp độ văn phòng hoặc gia đình Router thuộc về chúng ta, tương tự với cấp độ lớn hơn như nhà cung cấp dịch vụ internet (ISP) thì router thuộc về họ, ở cấp độ chính phủ thì router thuộc về chính phủ... 

TCP (Transmission control protocol)

    Các packet bị chia nhỏ và truyền tải phân tán qua mạng internet, vậy làm sao để chắc chắn răng toàn bộ dữ liệu đã được truyền tải và nhận được ở đích đến. It's TCP time! TCP quản lý việc gửi và nhận toàn bộ dữ liệu dưới dạng gói tin. Trách nhiệm của TPC giống như dịch vụ gửi thư đảm bảo. Khi các gói tin đến nơi, TCP sẽ tiến hành kiểm định và confirm đã nhận từng gói tin và ký đã nhận hàng. Nếu một vài gói tin bị thiếu , TCP sẽ không kí hoặc máy chủ chứa dữ liệu sẽ gửi lại các gói tin. Lúc này, máy tính sẽ chấp nhận sử dụng dữ liệu bị thiếu các gói tin (chấp nhận sai sót - fault tolenrance) hoặc đợi cho đến khi máy chủ gửi lại đầy đủ dữ liệu (dự phòng - redundancy). Nhờ những nguyên tắc này mà chúng ta có thể phát triển và mở rộng internet mà không làm gián đoạn dịch vụ của bất kì ai.

HTTP và HTML

    Các trang web và ứng dụng dựa trên nền web vẫn đang là một trong  những hình thức sử dụng internet phổ biến nhất hiện nay. Và để giao tiếp giữa các máy tính cá nhân và các máy chủ chứa website, các máy tính sử dụng giao thức HTTP (Giao thức truyền tải siêu văn bản - Hyper text transfer Protocol), giao thức này cũng dựa trên bộ giao thức TCP/IP. Khi thực hiện yêu cầu một trang web, máy khách  (client) thực hiện một request theo tiêu chuẩn, sau đó máy chủ sẽ nhận request và trả về các mã HTML (Hyper text markup language - Ngôn ngữ siêu văn bản). HTML là một tập hợp các quy tắc mô tả dữ liệu giúp cho phía server và client thống nhất về format dữ liệu hiển thị, sau đó client(trình duyệt) có thể hiển thị trang web dựa trên kết quả trả về. HyperText - Siêu văn bản ở đây nói đến các định dạng dữ liệu hiển thị bao gồm cả text, hình ảnh và video, file...
    Đến đây chúng ta đã hiểu được cách thức truyền tải dữ liệu qua mạng internet cho đến khi được sử dụng bởi một ứng dụng trên máy tính. Nhưng nếu dữ liệu truyền tải chỉ đơn thuần là các gói tin, hacker hoàn toàn có thể đứng ở các đầu router và đọc được các dữ liệu in/out từ network. Vậy làm sao để các gói tin di chuyển trên internet một cách an toàn?

Truyền nhận dữ liệu an toàn (HTTPS/SSL/TLS)

    Để dữ liệu được an toàn trong khi truyền dẫn, cần tuân thủ theo một số giải thuật mã hóa dữ liệu đảm bảo chỉ hai đầu gửi nhận có thể đọc được dữ liệu, các thành phần trung gian trong quá trình truyền tải không thể đọc được những dữ liệu này. Dữ liệu sẽ được được gửi qua một kênh an toàn bằng cách sử dụng Secure Socket Layer (SSL) và Transport Layer Security (TLS). Có thể coi SSL và TLS như một lớp bảo mật bao quanh việc truyền tải thông tin. Dễ nhận thấy nhất là các website đang truy cập có hình một chiếc khóa  ở thanh địa chỉ và tiền tố https (HyperText Markup Language Secure) trước địa chỉ website. Điều này có nghĩa là dữ liệu trang web của bạn đang được bảo vệ.


    Mã hóa dữ liệu sẽ giúp kết nối của chúng ta được an toàn trên Internet. SSL/TLS sử dụng giải thuật Public key/ Private key.

    Đầu tiên ta cần hiểu mục đích của quá trình mã hóa/giải mã (encrypt/decrypt) là gì. Từ hàng trăm năm trước, người ta đã nghĩ ra cách biến đổi nội dung của thư từ trước khi gửi đi, người gửi và người nhận sẽ cùng thống nhất chung với nhau một quy tắc về nội dung. Ví dụ quy tắc này có thể là: mỗi chữ cái được lùi lại 3 kí tự theo thứ tự trong bảng chữ cái: attack => xqqxzh. Nội dung trong thư sẽ là xqqxzh, người đưa tin hoặc quân địch khi phát hiện cũng không thể hiểu được. Chỉ người nhận biết được quy tắc này mới có thể hiểu nội dung.

    Trong khoa học máy tính, bộ quy tắc về mã hóa/giải mã này được gọi là giải thuật, bởi việc nghĩ ra một giải thuật là không hề đơn giản và tăng cường thêm bảo mật, bên cạnh giải thuật người ta còn sử dụng thêm các key. Với cùng một giải thuật nhưng sử dụng kèm các key(salt) khác nhau cũng sẽ cho ra các kết quả khác nhau, dữ liệu của cùng một giải thuật nhưng sử dụng các key khác nhau cũng sẽ được an toàn. Việc sử dụng chung một key để mã hóa/giải mã dữ liệu được gọi là mã hóa đối xứng  (symmetric encryption). Việc này có thể tiện nếu chỉ có hai phía, nhưng trong thế giới internet, các thành phần ở rất xa nhau, không thể nào gặp để thống nhất về giải thuật, ngoài ra với sức mạnh của máy tính hiện nay, việc brute force (thử tất cả key cho đến khi đúng) khiến cho việc mã hóa đối xứng không còn nhiều ưu thế.

    Một hình thức mã hóa khác là bất đối xứng (asymmetric encrytion). Chúng ta sử dụng một cặp Private key - public key để thực hiện mã hóa/ giải mã dữ liệu. Có thể có nhiều Public key hoặc có thể chia sẻ cho bất kỳ ai dùng để mã hóa dữ liệu, còn Private key sẽ được giữ kín để giải mã. Ý tưởng ở đây là chỉ những cặp Private Key/Public key được pair cùng với nhau thì mới có thể thực hiện cùng quá trình mã hóa/ giải mã. Một key dùng để mã hóa thì key còn lại có thể dùng để giải mã. Khi sử dụng một public key không pair với private key phía còn lại, dữ liệu sẽ không thể được giải mã và ngược lại.

    SSL/TLS cũng sử dụng nguyên tắc này để trao đổi dữ liệu. Hiểu một cách đơn giản, khi bạn truy cập một trang web có chứng chỉ hỗ trợ giao thức https, trình duyệt của bạn sẽ nhận được một chứng chỉ SSL (certificate), trình duyệt sử dụng chứng chỉ này như là một Public key để mã hóa/giải mã các dữ liệu khi thực hiện trao đổi với máy chủ. Phía máy chủ cũng giữ một Private key để mã hóa/giải mã các dữ liệu từ client.

Kết

    Hy vọng với bài viết này các bạn đã hiểu cách mà mạng Internet hoạt động, cả về vật lý, tính logic, và khả năng đảm bảo an toàn thông cho dữ liệu khi truyền tải qua mạng Internet. Ở bài viết sau chúng ta sẽ tìm hiểu kĩ hơn cách mà kết nối HTTPS được hình thành và các thành phần khác giúp đảm bảo dữ liệu truyền dẫn được đảm bảo an toàn.


Hướng dẫn xây dựng API gateway bằng Nodejs

 Ở bài viết trước, chúng ta đã tìm hiểu các chức năng và tầm quan trọng của API gateway trong kiến trúc microservice. Các tiêu chí trong việ...