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.
Mục lục bài viết(21)

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ì |
|---|---|
| HTTPS | HTTP Secure — phiên bản HTTP có lớp mã hoá. Đây là giao thức bạn thấy trong URL https://... |
| SSL | Secure 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 |
| TLS | Transport 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:
- Tên domain trong cert có trùng với domain bạn đang vào không? (
vietcodex.com↔ cert chovietcodex.com) - Cert chưa hết hạn? (cert Let's Encrypt sống 90 ngày)
- 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.
- 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ấp | Verify gì | Thời gian cấp | Giá/năm | Ví 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-200 | Doanh 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àng | 1-2 tuần | $200-800 | Ngâ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.comCertbot 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)
- Đăng ký Cloudflare miễn phí, add domain
- Đổi nameserver tại nhà đăng ký domain (Namecheap, GoDaddy, PA Vietnam) sang nameserver Cloudflare
- Trong Cloudflare → DNS, bật Proxy (cloud cam)
- 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-renewHSTS — "é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:
- Chrome thấy domain trong HSTS preload list → tự dùng
https:// - TLS handshake: Chrome ↔ Vietcombank server qua 20ms TLS 1.3
- Verify cert: ký bởi DigiCert EV → Chrome OK (DigiCert có trong root CA list)
- Session key thiết lập → trang load
- Bạn login → password mã hoá trong phong bì TLS → ISP/Wifi không đọc được
- Server set cookie session với
HttpOnly; Secure; SameSite=Strict→ cookie chỉ gửi qua HTTPS - Bạn chuyển tiền → request mã hoá → server xử lý
- Đă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ứng | Cá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 warning | Trang 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 cover | app.example.com báo lỗi, example.com OK | Cấ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
- Cookies, Session, Token — 3 cách web nhớ bạn — cookie Secure flag chỉ work qua HTTPS
- Domain, Hosting, DNS — 3 thứ phải mua riêng — Cloudflare cần đổi nameserver, có thể làm sau khi mua domain
- Internet là gì? Cách hoạt động dễ hiểu nhất — HTTPS chạy trên TCP/IP, là lớp ở giữa
- Mật khẩu được "băm" thế nào trong database — HTTPS bảo vệ password lúc truyền, hash bảo vệ lúc lưu (sắp có)