HTTPS, SSL/TLS và Certbot: Chặn Man-in-the-Middle với Let's Encrypt
Hướng dẫn HTTPS và TLS từ nền tảng đến production: rủi ro MITM của HTTP, chứng chỉ Let's Encrypt, Certbot với Nginx, ACME challenges, HSTS, renewal và troubleshooting.
ShanverseCập nhật 11 phút đọc— lượt xemĐang tải lượt xem
HTTPS & TLS
Deployment
HTTP là “cửa ngõ” cho Man-in-the-Middle như thế nào?
Một request HTTP đi qua nhiều hệ thống: Wi-Fi access point, router, ISP, proxy doanh nghiệp, CDN/load balancer và hạ tầng hosting. Bất kỳ điểm nào bị kiểm soát hoặc cấu hình sai đều có thể trở thành vị trí nghe lén hay can thiệp.
Ví dụ người dùng đăng nhập qua Wi-Fi công cộng:
Mermaid
Loading diagram…
Với HTTP, attacker có thể:
Đọc URL, header, cookie và request/response body.
Đánh cắp session cookie hoặc credential gửi qua form.
Thay JavaScript bằng mã độc để lấy password/token.
Chèn quảng cáo, crypto miner hoặc redirect phishing.
Sửa file tải xuống hoặc API response.
Bình luận
Theo dõi hành vi và metadata của người dùng.
Ngay cả website “chỉ đọc” cũng cần HTTPS. Một script bị chèn có thể tấn công người dùng, còn nội dung bị sửa làm mất tính toàn vẹn của ứng dụng.
TLS cung cấp ba thuộc tính gì?
Confidentiality: dữ liệu trên đường truyền được mã hóa.
Integrity: thay đổi trái phép trong phiên được phát hiện.
Authentication: browser kiểm tra chứng chỉ để xác nhận đang kết nối đúng hostname thông qua chuỗi tin cậy CA.
TLS không đảm bảo server không bị hack, JavaScript không có XSS hay người dùng không bị phishing. Nó bảo vệ kênh truyền giữa hai endpoint đã xác thực.
SSL và TLS có giống nhau không?
“SSL certificate” vẫn là cách gọi phổ biến, nhưng SSL 2.0/3.0 đã lỗi thời. Hệ thống hiện đại sử dụng TLS. Trong production, ưu tiên TLS 1.3 và hỗ trợ TLS 1.2 khi cần tương thích; không bật TLS 1.0/1.1 hay SSL cũ.
HTTPS là HTTP chạy bên trong kết nối TLS:
Chứng chỉ TLS xác nhận điều gì?
Browser kiểm tra tối thiểu:
Hostname có nằm trong SAN của certificate không.
Certificate còn hiệu lực không.
Chuỗi intermediate có dẫn tới root CA được tin cậy không.
Chữ ký và thuật toán có hợp lệ không.
Certificate có bị thu hồi theo cơ chế được client hỗ trợ không.
Chứng chỉ public không chứa private key. Private key phải được giữ kín trên server/secret store. Nếu private key bị lộ, revoke/thay certificate và key ngay; chỉ xóa file rò rỉ là không đủ.
Let's Encrypt, ACME và Certbot
Let's Encrypt là Certificate Authority phát hành chứng chỉ TLS miễn phí, tự động.
ACME là protocol chứng minh quyền kiểm soát domain và tự động hóa issuance/renewal.
Certbot là ACME client phổ biến, có plugin cho Nginx/Apache và các challenge khác.
Let's Encrypt không xác minh doanh nghiệp đứng sau website; nó xác minh quyền kiểm soát domain theo challenge đã chọn.
Chọn ACME challenge phù hợp
HTTP-01 chỉ xác minh qua port 80. Wildcard như *.example.com cần DNS-01. Không dùng DNS API token toàn quyền nếu provider hỗ trợ token giới hạn theo zone/record.
Kiến trúc Nginx reverse proxy
Mermaid
Loading diagram…
Có thể dùng HTTP giữa Nginx và app nếu cùng host hoặc private boundary được kiểm soát. Nếu hop đi qua mạng không tin cậy, cluster hoặc cloud network phức tạp, cân nhắc TLS/mTLS đến upstream.
Chuẩn bị trước khi chạy Certbot
Domain đã đăng ký.
A/AAAA record trỏ đúng server hoặc load balancer.
Port 80/tcp và 443/tcp được firewall/security group cho phép.
Nginx chạy và server_name đúng.
Không có CDN/proxy rule chặn /.well-known/acme-challenge/.
Đồng hồ hệ thống chính xác.
Email vận hành nhận được cảnh báo certificate.
Kiểm tra DNS:
Nếu có AAAA record nhưng server IPv6 không hoạt động, validation có thể thất bại. Sửa IPv6 hoặc xóa record sai.
Cấu hình Nginx HTTP ban đầu
Kiểm tra trước khi reload:
Không chạy Certbot cho domain chưa resolve tới đúng server.
Cài Certbot đúng theo hệ điều hành
Cách cài thay đổi theo distribution và web server. Dùng instruction generator chính thức tại certbot.eff.org/instructions, chọn đúng Nginx và OS.
Trên hệ thống hỗ trợ Snap, quy trình thường có dạng:
Nếu đường dẫn đã tồn tại, không tạo symlink lại. Không trộn package từ nhiều nguồn nếu không hiểu service/timer nào đang quản lý renewal.
Xin certificate và để Certbot cấu hình Nginx
Certbot sẽ:
Tạo ACME account/order.
Chứng minh quyền kiểm soát domain.
Lấy certificate và chain.
Cập nhật Nginx certificate paths.
Có thể thêm HTTP → HTTPS redirect.
Reload Nginx sau khi config hợp lệ.
Sau đó:
Kiểm tra hostname, expiry, issuer, chain và redirect—not chỉ nhìn biểu tượng ổ khóa.
Cấu hình Nginx HTTPS thủ công
Khi không muốn Certbot sửa config, dùng certbot certonly và tham chiếu symlink live:
Dùng fullchain.pem, không chỉ leaf certificate. Không copy certificate ra một path tĩnh rồi quên cập nhật khi renewal; tham chiếu symlink do Certbot quản lý và reload Nginx sau renew.
Webroot mode khi không muốn plugin sửa Nginx
Đảm bảo redirect, WAF và application routing không nuốt challenge path. Test một file tĩnh qua HTTP trước khi issuance.
DNS-01 cho wildcard
Hình dạng lệnh phụ thuộc DNS provider:
Dùng plugin/API để renewal tự động. Manual DNS challenge cần cập nhật TXT mỗi lần và không phù hợp production nếu không có quy trình tự động.
Bảo vệ DNS credential:
Token chỉ có quyền chỉnh record cần thiết.
File credential có permission chặt.
Không commit token vào Git hoặc Docker image.
Rotate token và audit DNS changes.
Tự động gia hạn là yêu cầu bắt buộc
Chứng chỉ Let's Encrypt có thời hạn ngắn; thiết kế phải giả định renewal tự động.
Kiểm tra scheduler tùy installation:
Không tạo cron thứ hai nếu package đã có systemd timer. Việc “có timer” chưa chứng minh renewal thành công—--dry-run mới kiểm tra quy trình gần thực tế.
Khi dùng certonly/custom config, thêm deploy hook để validate và reload:
Theo dõi expiry từ bên ngoài và alert đủ sớm. Renewal có thể hỏng do DNS, firewall, rate limit, permission, CDN hoặc plugin upgrade.
HTTP → HTTPS redirect và “first request problem”
Redirect không mã hóa request HTTP đầu tiên. Attacker có thể chặn redirect trước khi browser chuyển sang HTTPS.
HSTS giải quyết các lần truy cập sau bằng cách yêu cầu browser luôn dùng HTTPS:
Chỉ bật HSTS sau khi HTTPS ổn định. Với:
hãy chắc chắn mọi subdomain hỗ trợ HTTPS lâu dài. Preload khó rollback và có blast radius lớn; không copy cấu hình một cách máy móc.
HSTS phải được gửi qua HTTPS. Header nhận qua HTTP không được tin cậy.
Mixed content: trang HTTPS vẫn có thể không an toàn hoàn toàn
Sai:
Mọi script, stylesheet, font, image, API, iframe và WebSocket phải dùng HTTPS/WSS hoặc URL tương đối an toàn.
Sửa source URLs, không chỉ dựa vào browser auto-upgrade.
Kiểm tra DevTools console và CSP reports.
Không cho phép form trên trang HTTPS submit tới HTTP.
Đảm bảo CDN/object storage/custom domain đều có certificate hợp lệ.
Một script HTTP đủ để attacker chiếm toàn bộ trang HTTPS.
Cookie và proxy awareness
Sau HTTPS, cookie nhạy cảm cần:
Secure ngăn browser gửi cookie qua HTTP; HttpOnly giảm khả năng JavaScript đọc cookie; SameSite hỗ trợ chống cross-site request.
Nếu TLS terminate ở reverse proxy, ứng dụng phải chỉ tin X-Forwarded-Proto từ proxy tin cậy. Tin header này trực tiếp từ Internet có thể gây secure-cookie bug, redirect loop hoặc URL generation sai.
CDN và load balancer
Có hai TLS hop:
Chỉ mã hóa edge nhưng dùng HTTP qua mạng không tin cậy vẫn để lộ origin traffic. Dùng chế độ xác thực certificate origin nghiêm ngặt, không dùng chế độ chấp nhận certificate invalid.
Quản lý riêng:
Edge certificate.
Origin certificate.
Redirect/host canonicalization.
Real client IP trust chain.
Renewal ownership và alerting.
Kiểm tra TLS production
Checklist:
HTTP redirect đúng host/path, không loop.
TLS 1.2/1.3 hoạt động; protocol cũ bị tắt.
Certificate chứa mọi hostname cần phục vụ.
Full chain đúng và certificate chưa gần hết hạn.
Không mixed content.
Cookie có Secure, HttpOnly, SameSite phù hợp.
HSTS chỉ bật với scope đã kiểm tra.
OCSP/certificate status và external TLS scan không có lỗi nghiêm trọng.
Renewal dry-run và expiry alert hoạt động.
Những sai lầm phổ biến
“Không có login nên HTTP không sao.” Attacker vẫn có thể sửa JavaScript/content.
Chỉ bật HTTPS cho trang đăng nhập. Session và các request khác vẫn có thể bị chiếm.
HTTP redirect được xem là encryption. Request đầu tiên vẫn plaintext.
Certificate hợp lệ nhưng mixed content. Tài nguyên HTTP vẫn là điểm chèn mã.
Mở HTTPS nhưng quên renewal. Website sẽ outage khi certificate hết hạn.
Bật HSTS preload quá sớm. Subdomain chưa sẵn sàng có thể bị khóa truy cập.
Dùng DNS token toàn quyền. Credential bị lộ có thể ảnh hưởng toàn zone.
Copy privkey.pem vào repository/container image. Private key trở thành secret khó kiểm soát.
Chỉ kiểm tra apex domain.www, API, WebSocket và callback domain có thể thiếu SAN/certificate.
Tin mọi proxy header. Client có thể spoof scheme/IP nếu trust boundary sai.
Cho rằng TLS sửa được XSS/SQL injection. TLS chỉ bảo vệ transport.
Dùng “Flexible” edge TLS. Hop đến origin có thể vẫn là HTTP.
Checklist triển khai
DNS A/AAAA đúng và không có record IPv6 hỏng.
Port 80/443 được route và firewall đúng.
Nginx server_name khớp domain.
Chọn đúng HTTP-01, DNS-01 hoặc TLS-ALPN-01.
Cài Certbot từ nguồn được OS/tool hướng dẫn.
Certificate bao gồm apex và mọi hostname cần thiết.
Dùng fullchain.pem; private key được giới hạn permission.
Redirect HTTP → HTTPS không loop và giữ path/query.
Chỉ TLS 1.2/1.3 theo compatibility policy.
Không mixed content; API/WebSocket dùng HTTPS/WSS.
Cookie nhạy cảm có Secure, HttpOnly, SameSite.
HSTS rollout dần; includeSubDomains/preload được review.
certbot renew --dry-run thành công.
Nginx reload sau renewal và có external expiry alert.
CDN/LB xác thực origin certificate nghiêm ngặt.
Kết luận
HTTPS không phải một biểu tượng ổ khóa được cài một lần. Nó là một lifecycle gồm domain validation, private-key protection, cấu hình TLS, redirect, mixed-content cleanup, renewal và monitoring.
Certbot cùng Let's Encrypt làm issuance dễ hơn, nhưng production an toàn đòi hỏi kiểm tra challenge path, tự động gia hạn, reload service và cảnh báo từ bên ngoài. Khi TLS được triển khai end-to-end, attacker trên đường truyền không còn dễ dàng đọc hoặc sửa phiên HTTP—và ứng dụng có nền tảng vận chuyển an toàn để các lớp bảo mật khác hoạt động đúng.
Mục lục(23)
Codeplain text
1HTTP semantics2 ↓3TLS encryption + authentication + integrity4 ↓5TCP (và với HTTP/3 là QUIC/UDP)6 ↓7Network
Codeplain text
1includeSubDomains; preload
Codeplain text
1Browser --TLS--> CDN/LB --TLS or private hop--> Origin
Hướng dẫn lựa chọn thuật toán Load Balancing: Round Robin, Weighted Round Robin, Least Connections và IP Hash; kèm TypeScript, NGINX, health checks và HTTP/2 caveats.
Hướng dẫn tự động deploy ứng dụng Docker lên VPS Ubuntu và cloud providers bằng GitHub Actions: AWS ECS/App Runner/EC2, Vercel, Render, secrets, healthcheck, rollback và zero-downtime strategy.