HTTPS là gì và huớng dẫn cài đặt

Vấn đề hiện tại của HTTP

HTTP là một giao thức mạng, trao đổi thông tin với máy chủ qua cổng 80. Bình thuờng, khi bạn truy cập một trang web thông qua giao thức HTTP, tất cả nội dung form bạn nhập, bao gồm username, mật khẩu hay thông tin thẻ ngân hàng đều đuợc gửi thẳng đến server mà không thông qua mã hoá. Điều này rất nguy hiểm, bởi vì hacker có thể bắt đuợc gói tin của bạn và đánh cắp toàn bộ các thông tin trên.

HTTPS là gì

HTTPS viết tắt của HTTP Secure đã đuợc phát minh ra để giải quyết vấn đề trên. Những trang web sử dụng HTTPS luôn mã hoá các dữ liệu gửi đi, gửi đến vì vậy nguời dùng có thể hoàn toàn yên tâm, không bao giờ phải lo lắng bị đánh cắp những dữ liệu nhạy cảm. Hầu như toàn bộ trang web lớn đều sử dụng giao thức HTTPS như Google, Facebook, Microsoft. Khi bạn truy cập vào một trang web sử dụng HTTPS, góc bên trái thanh địa chỉ thuờng có biểu tuợng màu xanh lá như sau:

term-https.jpg

Cơ chế hoạt động của HTTPS dựa trên việc đóng gói toàn bộ giao thức HTTP vào trong Transport Layer Security (TLS) hoặc Secure Sockets Layer (SSL). Điều này có nghĩa là browser sẽ mã hoá toàn bộ request HTTP và truyền tải thông qua TLS đến cổng 443 của server. Server sẽ làm nhiệm vụ giải mã TLS và nhận lại đuợc request HTTP ban đầu, sau đó xử lí và response sẽ lại đuợc mã hoá gửi lại cho browser thông qua TLS.

Nhờ việc kết nối thông qua TLS nên toàn bộ thông tin về phuơng thức HTTP sẽ đuợc mã hoá như form data, request URL, query paramters, headers, cookies. Tuy nhiên, phần host và port thì không thể mã hoá đuợc vì đó là thành phần cơ bản của phuơng thức TCP/IP.

Để thực hiện cơ chế mã hoá và giải mã giữa client và server, chúng ta cần phải có một cặp khoá chung, cả 2 đều biết nhưng bảo mật, gọi là session key. Để bảo mật session key này, thì chúng ta cần sử dụng phương pháp mã hoá bất đối xứng, hay nói cách khác, chúng ta cần có một cặp khoá private key và public key. Chi tiết về quá trình handshake (bắt tay) trao đổi dữ liệu ban đầu của server và client sẽ diễn ra như sau:

  1. Client sẽ yêu cầu một kết nối bảo mật tới server, và cung cấp cho server danh sách những phương pháp mã hoá (ciphers and hash functions) mà client hỗ trợ.

  2. Từ danh sách đó, server chọn ra cipher và hash function mà nó có và thông báo lại cho client biết.

  3. Cạnh đó, server gửi kèm theo chứng chỉ số (digital certificate) bao gồm các thông tin như server name, đơn vị cung cấp chứng chỉ (CA - Certificate Authorities) và public key.

  4. Client sẽ liên lạc với CA đã cung cấp chứng chỉ cho server trên, và kiểm tra tính hợp lệ của chứng chỉ này.

  5. Sau đó, client sẽ bắt đầu sinh ra một session key, bằng cách sinh ra một số ngẫu nhiên và mã hoá nó bằng public key của server. Sau đó gửi Session Key này đến server. Và server sẽ dùng private key để giải mã nó và lấy được số ngẫu nhiên đó.

  6. Từ số ngẫu nhiên này, server và client sẽ dùng để mã hoá thông tin trao đổi bằng thuật toán khoá đối xứng (symmetric-key algorithm).

Nói thêm về CA. Để tránh việc hacker giả mạo server và gửi đến nguời dùng public key cũng như các packet giả mạo, thì chúng ta còn có một tổ chức đứng ở giữa chuyên cung cấp chứng thực bảo mật gọi là Certificate Authorities (CA). Những tổ chức này có nhiệm vụ chứng thực rằng public key mà nguời dùng nhận đuợc chính là của server hay tổ chức kia. Những CA này cần phải đuợc các trình duyệt tin tuởng. Một số CA nổi tiếng như: Symantec, Comodo, GeoTrust, GlobalSign, DigiCert.

Huớng dẫn lấy certificate

Việc đầu tiên chúng ta cần làm là tạo ra một cặp private và public key bằng lệnh sau:

openssl req -nodes -newkey rsa:2048 -keyout private.key -out public.csr

Sau đó màn hình sẽ hiện ra yêu cầu bạn nhập một số thông tin về quốc gia, công ty, mật khẩu. Bạn có thể ấn Enter để sử dụng các thông tin mặc định.

Bạn cần giữ private.key thật cẩn thận và không đuợc để lộ file này. Còn file public.csr thì dùng để đăng kí đến các CA và họ sẽ gửi lại cho bạn 1 file certificate có extension là .crt.

Bạn có thể truy cập vào trang chủ của những CA nổi tiếng như mình đã nêu ở trên, và đăng kí với mức phí khoảng $8-$40/năm. Ngoài ra cũng có một số trang web cho phép bạn đăng kí miễn phí với một số điều kiện nào đấy, hoặc chỉ đuợc dùng trong một khoảng thời gian (ví dụ 60 ngày). Đầu tiên phải kể đến là trang https://www.startssl.com, trang này của StartCom CA cung cấp chứng chỉ cho bạn miễn phí trong vòng 1 năm, nhưng thủ tục hơi ruờm rà một chút. Ngoài ra còn có trang web của Comodo ( https://www.comodo.com/e-commerce/ssl-certificates/free-ssl-certificate.php ) cũng cung cấp cho bạn chứng chỉ trong 90 ngày với các buớc thực hiện đơn giản hơn. Sau khi đuợc cấp chứng chỉ và cài đặt thành công trên server,

Tuy nhiên, trong truờng hợp bạn có ý định dùng nội bộ, bạn cần một kết nối bảo mật, song không muốn bỏ ra chi phí hàng năm để duy trì certificate. Bạn cũng có thể tự đăng kí chứng chỉ cho mình bằng cách gõ lệnh sau:

openssl x509 -req -days 365 -in public.csr -signkey private.key -out certificate.crt

Command này sẽ sinh cho bạn một file certificate.crt dùng để cài đặt vào server. Tuy nhiên, do chứng chỉ không phải từ một đơn vị CA đuợc browser tin cậy, nên khi truy cập các browser thuờng sẽ hiện lên cảnh báo như này:

Untitled.png

Huớng dẫn cài đặt HTTPS trên nginx

Sau khi có đuợc certificate, có thể thông qua mua hoặc tự tạo, bạn đã đủ nguyên liệu để cài đặt một server HTTPS. Trong khuôn khổ bài viết này, mình sẽ huớng dẫn các bạn cài đặt bằng nginx. Do giao thức HTTPS cần lắng nghe ở cổng 443 thay vì 80. Cách thức rất đơn giản, bạn chỉ cần config lại server nginx của bạn như sau:

server {
	listen				443 ssl;
    server_name			www.example.com;
    ssl_certificate		/path/to/certificate.crt;
    ssl_certificate_key	/path/to/private.key;
    ...
}

Bạn chạy lại service nginx

sudo service nginx restart

Và voila! Bạn đã có một server với kết nối hoàn toàn bảo mật, không lo bị đánh cắp dữ liệu nựa. (yeah3)

Tham khảo:

https://en.wikipedia.org/wiki/HTTPS

https://en.wikipedia.org/wiki/Transport_Layer_Security

https://en.wikipedia.org/wiki/Certificate_authority

https://en.wikipedia.org/wiki/Public-key_cryptography

https://devcenter.heroku.com/articles/ssl-certificate-self

http://nginx.org/en/docs/http/configuring_https_servers.html