Bật HTTPS và kiểm tra chứng chỉ
Bật HTTPS và kiểm tra chứng chỉ
Bài trước bạn đã trỏ domain về hosting và chờ DNS propagate. Domain đã trỏ đúng nhưng trên thanh địa chỉ vẫn là http:// kèm chữ "Not secure" thì tuyệt đối chưa được đưa cho ai dùng. Bài này là bước cuối để URL của bạn có ổ khóa xanh, và quan trọng hơn: biết tự kiểm tra chứ không tin cảm giác.
Sau 25 phút, bạn sẽ:
- Bật được HTTPS cho domain trên hosting đang dùng
- Ép toàn bộ traffic HTTP sang HTTPS bằng redirect 301
- Tự xác nhận chứng chỉ hợp lệ bằng trình duyệt và
curl - Nhận ra 4 lỗi chứng chỉ thường gặp và biết sửa ở đâu
HTTPS làm gì cho app của bạn
HTTPS chỉ là HTTP chạy bên trong một kết nối TLS đã mã hóa. Kết nối đó cần một certificate do một CA (Certificate Authority) ký, xác nhận rằng domain này đúng là của bạn. Không có cert, mật khẩu người dùng đi qua mạng dưới dạng đọc được, và trình duyệt sẽ hù người dùng bằng cảnh báo đỏ.
Ba điều cần nhớ:
- Let's Encrypt cấp cert miễn phí, nhưng chỉ sống khoảng 90 ngày. Nghĩa là phải bật auto renew, không có ngoại lệ.
- Cert gắn với tên domain, không gắn với IP. Thiếu
wwwlà một cert khác. - CA xác thực domain qua DNS hoặc HTTP, nên DNS phải trỏ đúng trước khi xin cert.
Warning: Cert hết hạn không phải lỗi nhỏ. Trình duyệt chặn gần như toàn bộ người dùng, kể cả người dùng cũ. Tôi từng để job renew chết lặng vì thẻ tín dụng hết hạn và app chết đúng đêm cuối tuần.
Bật HTTPS trên hosting
Có hai kiểu hosting, cách làm khác hẳn nhau.
Hosting có sẵn SSL tự động (Vercel, Netlify, Render, Railway, Fly.io): bạn chỉ cần thêm domain vào dashboard, hệ thống tự cấp cert. Việc của bạn là chờ trạng thái chuyển sang "Active" và bấm nút Force HTTPS nếu có.
VPS tự quản (nginx, Apache trên server riêng): bạn tự cài cert.
- Xác nhận domain đã trỏ đúng:
dig +short example.com - Bật SSL trên dashboard hosting, hoặc cài cert bằng
sudo certbot --nginx -d example.com -d www.example.com - Kiểm tra auto renew:
sudo certbot renew --dry-run - Mở
https://example.combằng trình duyệt và xem ổ khóa
Bước 3 là bước người ta hay bỏ qua nhất. Chạy --dry-run ngay bây giờ, đừng đợi đến ngày thứ 89.
Bài tập 1. Chạy curl -I https://example.com (thay domain của bạn). Dòng đầu tiên trả về mã gì? Nếu là 200 hoặc 301 thì tốt, nếu command báo lỗi certificate thì quay lại bước 2.
Gợi ý đáp án
curl mặc định xác thực cert. Nếu cert sai, bạn nhận thông báo kiểu SSL certificate problem. Chỉ khi thấy HTTP/2 200 (hoặc 301) thì kết nối TLS đã hợp lệ.
Ép HTTP sang HTTPS, đừng để hai cửa
Bật HTTPS chưa đủ. Nếu http://example.com vẫn trả nội dung bình thường, bạn đang có hai cửa vào app và người dùng có thể dùng nhầm cửa không mã hóa. Cách chuẩn là trả 301 redirect về bản HTTPS.
Với nginx:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
Với hosting có dashboard, tìm mục Force HTTPS, SSL redirect hoặc Always use HTTPS và bật lên.
Kiểm tra bằng:
curl -I http://example.com
Bạn cần thấy 301 và một dòng location: https://example.com/.... Nếu vẫn là 200, redirect chưa có tác dụng.
Bài tập 2. Kiểm tra cả bốn tổ hợp: http://, https://, có www, không www. Ghi lại mã trạng thái của từng tổ hợp. Mục tiêu: cả bốn đều kết thúc ở một URL chuẩn duy nhất bằng HTTPS.
Gợi ý đáp án
Ví dụ chuẩn: http://example.com → 301, http://www.example.com → 301, https://www.example.com → 301, https://example.com → 200. Điều cần tránh là vòng lặp redirect hoặc hai bản nội dung cùng trả 200 vì Google sẽ coi là trùng lặp.
Bốn chỗ chứng chỉ hay hỏng
flowchart TD
A["🔒 Mở https://domain"] --> B{"Trình duyệt báo lỗi?"}
B -- Không --> OK["✅ Cert hợp lệ"]
B -- Có --> C{"Lỗi gì?"}
C -- "Hết hạn" --> D["Gia hạn và bật auto renew"]
C -- "Tên không khớp" --> E["Cấp lại cert có cả www"]
C -- "Mixed content" --> F["Đổi mọi URL tài nguyên sang https"]
C -- "Chain thiếu" --> G["Cài đủ intermediate certificate"]
Cách kiểm tra cert mà không cần tin vào mắt:
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -dates
Bạn sẽ thấy tên domain và ngày hết hạn. Đối chiếu ngày hết hạn với hôm nay, đừng đoán.
Bài tập 3. Mở trang HTTPS của bạn, bấm vào ổ khóa, xem phần Certificate. Ghi lại ba thông tin: cấp cho tên nào, hết hạn ngày nào, do CA nào ký. Nếu trang tải được nhưng vài ảnh hoặc font bị vỡ, đó là mixed content, và nó cũng làm mất ổ khóa xanh.
Gợi ý đáp án
Mixed content xảy ra khi HTML chạy trên HTTPS nhưng vẫn trỏ tới http://.... Cách sửa: tìm trong code các URL http:// (thường ở ảnh, font, script CDN) và đổi sang https://, hoặc dùng đường dẫn tương đối. Mở DevTools, tab Console, trình duyệt liệt kê chính xác tài nguyên nào bị chặn.
Những lỗi tôi đã trả giá để học
- Kiểm tra ngày hết hạn ngay khi bật cert, rồi đặt nhắc lịch trước 14 ngày. Auto renew có thể chết mà không ai báo.
- Đừng bật HSTS vội. HSTS buộc trình duyệt luôn dùng HTTPS, kể cả subdomain chưa có cert. Chỉ bật khi mọi subdomain đã HTTPS, vì nó gần như không gỡ ngược được nhanh.
- Test trên cửa sổ ẩn danh. Trình duyệt của bạn có thể cache cert cũ hoặc redirect cũ và cho bạn cảm giác an toàn giả.
- Kiểm tra cả
wwwlẫn khôngwww. Rất nhiều người dùng gõwwwtheo thói quen. - Đừng dùng nút "Proceed anyway" như một giải pháp. Nếu cert sai với bạn, nó sai với tất cả người dùng.
HTTPS là HTTP chạy trong kết nối _____ đã được mã hóa.
Certificate của Let's Encrypt có hạn khoảng _____ ngày, nên bắt buộc phải bật auto renew.
Redirect chuẩn từ HTTP sang HTTPS dùng mã trạng thái _____.
Lỗi xảy ra khi trang HTTPS tải tài nguyên qua http:// được gọi là _____.
Lệnh openssl s_client -connect example.com:443 dùng để _____.
Mang theo gì sang bài sau
Bây giờ bạn đã có: cert hợp lệ, redirect HTTP sang HTTPS, và một cách kiểm tra độc lập thay vì tin vào cảm giác. Đó là toàn bộ phần "công khai" của hạ tầng.
Bài tiếp theo là checkpoint của module: bạn sẽ chạy lại toàn bộ chuỗi hosting, domain, HTTPS trên app thật và tự chấm xem cái nào còn thiếu trước khi đi tiếp sang phần cấu hình an toàn và giám sát.
Front: HTTPS thực chất là gì? Back: HTTP chạy bên trong một kết nối TLS đã được mã hóa.
Front: Certificate chứng minh điều gì? Back: Domain đang truy cập thuộc quyền kiểm soát của chủ sở hữu và đã được CA xác nhận.
Front: Cert của Let's Encrypt có hạn bao lâu? Back: Khoảng 90 ngày, nên bắt buộc phải bật auto renew.
Front: Mã redirect chuẩn từ HTTP sang HTTPS là gì? Back: 301, redirect vĩnh viễn.
Front: Lệnh nào kiểm tra nhanh redirect HTTP? Back: curl -I http://example.com, xem mã 301 và header location.
Front: Lệnh nào xem chi tiết cert của domain từ xa? Back: openssl s_client -connect example.com:443 -servername example.com
Front: Vì sao phải chờ DNS trỏ đúng trước khi xin cert? Back: CA xác thực quyền sở hữu domain qua DNS hoặc HTTP, DNS sai thì xác thực thất bại.
Front: Mixed content là gì? Back: Trang chạy HTTPS nhưng vẫn tải tài nguyên qua http:// nên bị chặn một phần.
Front: Lỗi tên không khớp (domain mismatch) thường do đâu? Back: Cert chỉ cấp cho một tên, ví dụ thiếu www hoặc thiếu subdomain đang dùng.
Front: HSTS là gì và khi nào nên bật? Back: Header buộc trình duyệt luôn dùng HTTPS, chỉ bật khi mọi subdomain đã có HTTPS.
Front: Hậu quả khi cert hết hạn? Back: Trình duyệt chặn hoặc cảnh báo đỏ, gần như toàn bộ người dùng không vào được.
Front: Làm sao kiểm tra auto renew có hoạt động? Back: Chạy certbot renew --dry-run và xem job renew có chạy đúng lịch.
Front: Vì sao phải test cả www và không www? Back: Nhiều người dùng gõ www theo thói quen, mỗi tên cần cert và redirect đúng.
Front: Cổng mặc định của HTTPS? Back: 443.