HTTPS, SSL, TLS — vì sao web không có ổ khoá xanh thì khách bỏ chạy

HTTP gửi data như postcard — ai đi qua cũng đọc được. HTTPS bọc bưu phẩm trong phong bì niêm phong, chỉ người nhận mở được. Hiểu HTTPS giúp bạn biết tại sao Chrome cảnh báo 'Not Secure', vì sao SEO Google ưu tiên HTTPS, và cài Let's Encrypt miễn phí trong 5 phút.

10 phút đọcCập nhật 2026-05-22
Nghe bài viết
Để Claude đọc bài cho bạn — vừa nghe vừa làm việc khác
Mục lục bài viết(21)
Sơ đồ mã hoá khoá công khai — sender dùng public key để mã hoá, receiver dùng private key để giải mã

Mã hoá khoá công khai (public-key cryptography) — nền tảng toán học của HTTPS. Server có cặp khoá: public key (ai cũng có), private key (chỉ server biết). Browser dùng public key của server mã hoá tin nhắn → chỉ server có private key giải mã được. Đó là lý do bạn có thể "gửi mật khẩu" qua mạng công cộng mà không sợ bị nghe lén. Nguồn: Wikimedia Commons (public domain).

Hiểu đơn giản nhất

Internet như dịch vụ bưu chính. Mỗi request từ máy bạn đến server đi qua 5-10 router (bưu cục trung gian) — ISP, switch quận, ISP backbone, IXP, datacenter.

HTTP = gửi postcard (bưu thiếp). Mọi router đi qua đều đọc được toàn bộ nội dung — gồm cả password bạn vừa nhập.

HTTPS = gửi bưu phẩm trong phong bì niêm phong. Chỉ máy bạn và server có chìa khoá mở phong bì. Router thấy phong bì nhưng không đọc được bên trong.

3 từ bạn nghe thường xuyên — HTTPS, SSL, TLS — thực tế đều là cùng 1 thứ:

Thuật ngữLà gì
HTTPSHTTP Secure — phiên bản HTTP có lớp mã hoá. Đây là giao thức bạn thấy trong URL https://...
SSLSecure Sockets Layer — tên cũ của lớp mã hoá. Đã lỗi thời từ 2015, nhưng tên còn dùng vì quen miệng
TLSTransport Layer Security — tên mới, là phiên bản hiện đại của SSL. Web hiện nay dùng TLS 1.2 hoặc 1.3

Khi bạn mua "SSL certificate" — thực ra bạn đang mua TLS certificate. HTTPS = HTTP chạy bên trên TLS.

Tại sao bạn cần biết

  • Khách thấy "Not Secure" là tỉ lệ chuyển đổi tụt 30-50%. Chrome cảnh báo từ 2018, Safari/Firefox theo sau. Web bán hàng không HTTPS = tự cắt chân.
  • Google chỉ index ưu tiên HTTPS. Hai web cùng nội dung, HTTPS xếp trước HTTP. SEO ranking factor xác nhận từ 2014 (Stacker 2026 cite Google quote).
  • HTTPS bắt buộc cho HTTP/2 và HTTP/3. Hai giao thức mới nhanh hơn 30-50% so với HTTP/1.1 — nhưng chỉ chạy trên TLS. Không HTTPS = web bạn chậm bằng web 2010.
  • PCI-DSS / GDPR yêu cầu. Web nhận thanh toán hoặc data EU PHẢI HTTPS. Vi phạm = phạt + bị Stripe/Visa cấm.
  • Service Worker, Web Push, Geolocation API chỉ work qua HTTPS. PWA không HTTPS = không cài được.

TLS hoạt động thế nào — TLS handshake

Khi bạn gõ https://vietcodex.com và nhấn Enter, 6 bước diễn ra trước khi web bắt đầu load:

Bước 1: Client Hello

Browser gửi tới server:

"Tôi muốn nói chuyện HTTPS với vietcodex.com.
 Tôi hỗ trợ TLS 1.2 và TLS 1.3.
 Tôi biết 12 thuật toán mã hoá này: ..."

Bước 2: Server Hello + Certificate

Server response:

"Dùng TLS 1.3 với thuật toán ECDHE_RSA_AES_256_GCM.
 Đây là certificate của tôi, ký bởi Let's Encrypt:
 [certificate data — public key + tên domain + ngày hết hạn + chữ ký CA]"

Bước 3: Browser verify certificate

Browser kiểm tra:

  1. Tên domain trong cert có trùng với domain bạn đang vào không? (vietcodex.com ↔ cert cho vietcodex.com)
  2. Cert chưa hết hạn? (cert Let's Encrypt sống 90 ngày)
  3. Cert ký bởi CA tin cậy? — browser có sẵn 100+ root CA. Tracing ngược: cert vietcodex.com ← R3 ← ISRG Root X1 (Let's Encrypt). ISRG có trong danh sách CA tin cậy của Chrome → OK.
  4. Cert chưa bị revoke? — check qua OCSP

Nếu bất kỳ bước nào fail → browser hiện "Your connection is not private" warning.

Bước 4: Key exchange

Browser và server thoả thuận session key (khoá đối xứng) để mã hoá data thực. Trong TLS 1.3 dùng thuật toán ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) — mỗi session dùng khoá khác → kể cả private key server bị lộ sau này, session cũ vẫn an toàn (gọi là forward secrecy).

Bước 5: Finished

Cả 2 bên xác nhận handshake xong. Từ đây mọi data trao đổi đều mã hoá bằng session key.

Bước 6: HTTP request bắt đầu

Browser mới gửi request GET / HTTP/1.1 — nhưng giờ đã trong "phong bì niêm phong".

TLS 1.3 tối ưu: bước 1+2 gộp lại + có 0-RTT cho session đã từng kết nối — tổng overhead chỉ ~20-50ms cho lần đầu, gần 0ms cho các kết nối tiếp theo.

Certificate authority (CA) — ai cấp cert?

Cert không tự ký được — phải có bên thứ ba tin cậy ký. Đó là Certificate Authority.

3 cấp độ verify (Domain / Organization / Extended)

CấpVerify gìThời gian cấpGiá/nămVí dụ web nên dùng
DV (Domain Validated)Chỉ verify bạn sở hữu domain (đáp ứng DNS challenge hoặc file challenge)5 phút - vài giờMiễn phí (Let's Encrypt, ZeroSSL)95% web — blog, SaaS, ecommerce nhỏ-vừa
OV (Organization Validated)Verify pháp nhân (đối chiếu giấy phép kinh doanh, danh bạ doanh nghiệp)1-3 ngày$50-200Doanh nghiệp muốn show tên trong cert details
EV (Extended Validation)Verify rất kỹ — đăng ký pháp nhân, địa chỉ, ngân hàng1-2 tuần$200-800Ngân hàng, sàn chứng khoán, bảo hiểm

⚠️ EV không còn hiển thị tên tổ chức trên thanh địa chỉ Chrome từ 2019. Khách bình thường không phân biệt được DV/OV/EV nữa. 95% case dùng DV miễn phí là đúng.

Let's Encrypt — cách mạng SSL miễn phí

Let's Encrypt (2016) là CA phi lợi nhuận của Internet Security Research Group. Cấp cert DV miễn phí, sống 90 ngày, auto-renew qua Certbot hoặc script ACME.

Trước Let's Encrypt: cert SSL giá $50-500/năm, cài tay phức tạp. Sau Let's Encrypt: 95% web bật được HTTPS không tốn xu nào. Hiện > 50% web toàn cầu dùng Let's Encrypt.

Cài Let's Encrypt trên VPS Linux:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d vietcodex.com -d www.vietcodex.com

Certbot tự sửa config nginx, tự renew qua cron. Hết.

3 cách bật HTTPS — đơn giản nhất tới phức tạp nhất

1. Cloudflare (đơn giản nhất — 5 phút)

  1. Đăng ký Cloudflare miễn phí, add domain
  2. Đổi nameserver tại nhà đăng ký domain (Namecheap, GoDaddy, PA Vietnam) sang nameserver Cloudflare
  3. Trong Cloudflare → DNS, bật Proxy (cloud cam)
  4. SSL/TLS → bật Full (strict)

Xong. Cloudflare tự cấp Universal SSL miễn phí. Bonus: CDN, DDoS protection, image optimization free.

2. Vercel / Netlify / Render (zero-config)

Add domain → platform tự cấp Let's Encrypt + auto-renew. Không cần làm gì.

3. VPS với Certbot (cần Linux command line)

sudo certbot --nginx -d example.com -d www.example.com
sudo systemctl enable certbot.timer  # auto-renew

HSTS — "ép" browser luôn dùng HTTPS

Sau khi bật HTTPS, vẫn còn 1 lỗ: lần đầu user gõ vietcodex.com (không có https://), browser thử HTTP trước → server redirect sang HTTPS. Trong vài mili-giây giữa "thử HTTP" và "redirect", hacker WiFi có thể chèn vào (SSL stripping).

HSTS giải quyết: server gửi header Strict-Transport-Security: max-age=63072000; includeSubDomains; preload. Browser thấy → ghi nhớ "từ giờ luôn dùng HTTPS cho domain này" — không có lỗ HTTP nào nữa.

preload = submit domain vào danh sách HSTS preload list mà Chrome/Firefox/Safari ship sẵn. Browser lần đầu vào cũng dùng HTTPS — không cần "lần đầu HTTP" nào cả.

⚠️ Khi bật HSTS với max-age lớn, không revert được trong thời gian đó. Test kỹ HTTPS chạy ổn 1-2 tuần trước khi tăng max-age lên 1+ năm.

vietcodex.com cài: max-age=63072000; includeSubDomains; preload (2 năm).

Ví dụ thực tế: Bạn vào ngân hàng online

Bạn gõ vietcombank.com.vn vào Chrome:

  1. Chrome thấy domain trong HSTS preload list → tự dùng https://
  2. TLS handshake: Chrome ↔ Vietcombank server qua 20ms TLS 1.3
  3. Verify cert: ký bởi DigiCert EV → Chrome OK (DigiCert có trong root CA list)
  4. Session key thiết lập → trang load
  5. Bạn login → password mã hoá trong phong bì TLS → ISP/Wifi không đọc được
  6. Server set cookie session với HttpOnly; Secure; SameSite=Strict → cookie chỉ gửi qua HTTPS
  7. Bạn chuyển tiền → request mã hoá → server xử lý
  8. Đăng xuất → cookie expire → session ID invalidate ở DB

Cả phiên giao dịch — kể cả từ Starbucks WiFi — đều an toàn vì TLS bọc kín. Nếu Vietcombank còn dùng HTTP: ngồi cạnh quán cafe sniff packet là thấy password.

Cái gì có thể sai

Vấn đềTriệu chứngCách fix
Cert hết hạn"Your connection is not private — NET::ERR_CERT_DATE_INVALID"Renew cert (certbot renew) hoặc đổi sang Cloudflare auto
Tên domain không khớp"NET::ERR_CERT_COMMON_NAME_INVALID"Cấp cert đúng cho www.example.com lẫn example.com
Mixed content warningTrang HTTPS không show ảnh HTTPĐổi mọi http:// trong HTML/CSS/JS thành https://
Self-signed cert"NET::ERR_CERT_AUTHORITY_INVALID"Đừng dùng self-signed cho production — xài Let's Encrypt
Subdomain không coverapp.example.com báo lỗi, example.com OKCấp wildcard cert (*.example.com) hoặc thêm subdomain vào SAN
TLS version cũBrowser cũ vào lỗi "TLS handshake failed"Server bật cả TLS 1.2 + 1.3 (đừng disable 1.2 vội — vẫn còn user IE/Safari cũ)
HSTS lock + đổi domainĐổi từ HTTPS sang HTTP báo lỗi không vào đượcĐợi max-age hết hạn (vài tháng-vài năm) — đó là lý do test kỹ trước

Tóm tắt 1 dòng

HTTPS = HTTP chạy bên trong TLS (phiên bản mới của SSL). Bọc data trong "phong bì niêm phong" bằng public-key crypto + session key. Bật HTTPS miễn phí với Let's Encrypt + Cloudflare trong 5 phút. Không HTTPS = "Not Secure" trên Chrome + tụt SEO + mất 30-50% conversion.

Đọc tiếp

Câu hỏi thường gặp

SSL và TLS khác nhau như thế nào?
SSL (Secure Sockets Layer) là tên gốc do Netscape tạo 1995, có 3 phiên bản (SSL 1.0/2.0/3.0) đều đã lỗi thời và lỗi bảo mật. TLS (Transport Layer Security) là tên mới từ 1999, là phiên bản cập nhật của SSL. Hiện nay web dùng TLS 1.2 (2008) hoặc TLS 1.3 (2018). Tuy nhiên người ta vẫn quen gọi 'SSL certificate' dù thực tế là TLS — như quen gọi 'Xerox' cho mọi máy photocopy. Khi cài cert nhận tên file `.pem` hay `.crt` thì là TLS cert.
Let's Encrypt miễn phí có an toàn bằng cert mua trả tiền không?
An toàn ngang nhau về mặt mật mã — cùng thuật toán RSA 2048 hoặc ECDSA P-256. Khác nhau ở: (1) Let's Encrypt cert hết hạn sau 90 ngày, phải auto-renew (Certbot làm tự động); (2) Let's Encrypt chỉ verify domain (DV) — không verify tổ chức (OV/EV); (3) DigiCert/Sectigo cấp EV cert có tên tổ chức hiện trên thanh địa chỉ (nhưng Chrome 2019 đã ẩn UI này). Cho 95% web (blog, SaaS, ecommerce nhỏ-vừa), Let's Encrypt miễn phí đủ. Chỉ ngân hàng, sàn chứng khoán mới cần EV cert.
Tại sao Chrome hiện 'Not Secure' khi web không HTTPS?
Từ 2018, Chrome bắt đầu hiện 'Not Secure' cho mọi trang HTTP — không chỉ trang có form login mà cả trang landing tĩnh. Lý do: (1) ISP/quán cafe có thể chèn quảng cáo vào trang HTTP của bạn (man-in-the-middle); (2) Hacker WiFi công cộng đọc được mọi request HTTP; (3) Google muốn 'normalize' HTTPS để web an toàn hơn. Khách thấy 'Not Secure' có xu hướng đóng tab và không quay lại — thống kê cho thấy bounce rate tăng 30-50%.
HTTPS có làm web chậm hơn không?
Trong quá khứ có — TLS 1.2 cần 2 round-trip thêm cho handshake (~200-400ms ở mạng VN). Hiện nay với TLS 1.3 + HTTP/2 + session resumption, overhead còn ~20-50ms cho lần đầu, hầu như 0ms cho các request tiếp theo. Cloudflare/Vercel còn pre-warm TLS connection. Năm 2026 không có lý do gì để không HTTPS toàn site. Bonus: HTTP/2 và HTTP/3 chỉ chạy được trên HTTPS → HTTPS thực tế nhanh hơn HTTP.
Có cần tự cài SSL certificate không? Có cách nào tự động?
Có 3 cách dễ nhất (theo độ đơn giản giảm dần): (1) **Cloudflare** — bật Proxy ở DNS, Cloudflare tự cấp SSL Universal miễn phí, auto-renew 90 ngày, mất 5 phút setup; (2) **Vercel/Netlify/Render** — tự cấp Let's Encrypt cho mọi domain bạn add, không cần làm gì; (3) **Certbot trên VPS** — chạy `certbot --nginx -d example.com`, tự config + cron auto-renew, mất 10-15 phút. Tuyệt đối không mua SSL từ nhà cung cấp hosting nhỏ giá 500k-1tr/năm — đó là scam của hosting Việt Nam, bản chất họ resell Let's Encrypt miễn phí.
Mixed content warning là gì?
Khi trang HTTPS load tài nguyên HTTP (ảnh, CSS, JS, video) — browser gọi đó là 'mixed content'. Chrome chặn JS/CSS HTTP mặc định, cảnh báo cho ảnh HTTP. Lý do: hacker có thể replace JS HTTP đó bằng code độc → kiểm soát toàn trang HTTPS của bạn. Cách fix: tất cả URL trong code dùng `https://` thay vì `http://`, hoặc dùng URL không có scheme: `//example.com/img.jpg` (browser tự chọn scheme theo trang). Audit web migrate sang HTTPS phải grep toàn bộ `http://` để chuyển.
HSTS là gì? Có nên bật không?
HSTS (HTTP Strict Transport Security) là header server gửi để báo browser 'từ giờ đừng gửi HTTP cho domain này nữa, kể cả khi user gõ http://'. Bật bằng header `Strict-Transport-Security: max-age=63072000; includeSubDomains; preload`. Khi browser đã 'nhớ' domain trong HSTS list, hacker không thể downgrade về HTTP nữa (chống SSL stripping attack). Submit vào HSTS preload list của Chrome để browser load list này từ đầu. PHẢI test kỹ trước khi bật max-age dài — sai là không revert được. vietcodex.com đang bật max-age 2 năm + preload.