Kiểm hạn SSL trước outage | Freelancer VN hay quên renew
Outage SSL hầu như luôn đoán trước được — hết hạn theo lịch, không phải “sập bất ngờ”. Freelancer ship site khách VN hay quên: Let’s Encrypt 90 ngày, renew trên disk nhưng chưa reload, health check CDN vẫn 200 trong khi cert leaf đã đỏ. Trước bàn giao và mỗi tháng: đọc notAfter, theo dõi job renew, probe bên ngoài. Spot-check: SSL Check.
Thứ Năm site vẫn xanh. Thứ Sáu 17:00 khách nhắn Zalo kèm screenshot Chrome đỏ: “Kết nối của bạn không phải là kết nối riêng tư”. Nguyên nhân: cert Let’s Encrypt hết hạn vì auto-renew fail từ tháng 3 — monitoring chỉ ping HTTP qua CDN edge còn cache. Bài đăng “site down” viết sẵn; freelancer thức đêm renew tay.
Bài này tập trung kiểm hạn trước outage trong ngữ cảnh freelance / agency nhỏ Việt Nam ship WordPress, Laravel, Nest lên VPS hoặc shared hosting — không phải bài quảng cáo CA.
Bài viết này giúp bạn
- Đọc notAfter bằng openssl / trình duyệt / tool
- Hiểu vì sao HTTP health ≠ TLS OK
- Bẫy LE 90 ngày, chain, SAN, Cloudflare Full Strict
- Checklist bàn giao + runbook khi đã đỏ
- Dùng SSL Check Kawa để soi nhanh trước deploy
Hết hạn SSL xảy ra điều gì
- Trình duyệt cảnh báo đỏ — đa số user SME không bấm “Advanced”. Tỷ lệ thoát tăng ngay.
- API / webhook / thanh toán — client server-to-server fail handshake; app “đứng” dù bạn mở được trang qua cách bỏ qua cảnh báo.
- SEO / uy tín — HTTPS lâu ngày lỗi là tín hiệu xấu; với cửa hàng nhỏ còn mất tin nhắn Zalo từ khách “web bị hack?”.
- HSTS preload — nếu đã preload, user khó bypass; outage đau hơn. Cần break-glass (status page domain khác) trước ngày hết hạn.
Ba cách kiểm tra nhanh
1. openssl (chuẩn cho host:port bạn quan tâm)
echo | openssl s_client -connect shop-khach.vn:443 -servername shop-khach.vn 2>/dev/null \
| openssl x509 -noout -dates -subject -issuer
notBefore/notAfter— hạn dùng (UTC; đừng nhầm giờ VN khi countdown sát ngày).-servername(SNI) quan trọng khi một IP phục vụ nhiều domain.
Windows: dùng Git Bash, WSL, hoặc máy build Linux CI. Không có openssl? Dùng bước 3.
2. Trình duyệt
Padlock → Connection is secure → Certificate → Valid until. Tiện cho demo với khách; khó tự động hóa inventory nhiều host.
3. Tool spot-check
Mở Kiểm tra chứng chỉ SSL, nhập domain, đọc hạn và thông tin cert. Phù hợp checklist trước bàn giao hoặc trước kỳ nghỉ lễ khi bạn không muốn gõ lại cờ openssl.
curl -vI https://shop-khach.vn 2>&1 | findstr /i expire
(trên Unix dùng grep -i expire). Chỉ là gợi ý — openssl notAfter rõ ràng hơn.
Monitoring: tín hiệu nào thật sự cứu bạn
| Tín hiệu | Cảnh báo khi | Ghi chú |
|---|---|---|
| Ngày còn lại | < 30 (LE: < 14–21) | Bắt buộc cho mọi hostname public |
| Job renew | Fail / không chạy | Im lặng từ tháng 3 → outage tháng 6 |
| TLS handshake ngoài | Fail từ probe ngoài VPC | Check nội bộ có thể 'nhìn' cert khác |
| HTTP 200 CDN | — không đủ | Edge có thể xanh khi origin/cert path đã hỏng |
UptimeRobot / Better Stack / healthz nội bộ chỉ GET / thường không parse ngày hết hạn. Thêm check chuyên TLS hoặc script tuần export notAfter vào file git-diff được.
Let’s Encrypt — vì sao freelancer hay dính
Chu kỳ 90 ngày cố ý ngắn để giảm rủi ro key bị lộ lâu. Hệ quả: không có auto-renew = chắc chắn đỏ.
| Chế độ fail | Triệu chứng | Việc làm |
|---|---|---|
| HTTP-01 bị chặn | Firewall, CDN không route /.well-known/acme-challenge | Mở path challenge hoặc chuyển DNS-01 |
| DNS-01 token cũ | API token DNS xoay, secret cert-manager chưa cập nhật | Rotate secret; dry-run staging |
| Rate limit | Quá nhiều order fail | Fix trên staging CA trước |
| AAAA hỏng | A ổn, AAAA trỏ máy chết — LE validate IPv6 | Sửa/xóa AAAA |
| Renew OK, chưa reload | File mới trên disk, nginx vẫn phục vụ cert cũ | nginx -s reload / restart unit |
certbot renew --dry-run trước production cứu cuối tuần. Shared hosting (cPanel AutoSSL): xác nhận lần chạy gần nhất trong panel — đừng giả định “hosting lo hết”.
Bẫy thường gặp khi ship site khách
”Có Cloudflare là không cần lo”
Full (strict) vẫn đòi origin cert hợp lệ. Cam không biến cert hết hạn thành hợp lệ. Client kết nối thẳng IP VPS (bỏ qua CF) vẫn đỏ.
Chỉ nhìn leaf, quên chain
Thiếu intermediate: Chrome mới có thể OK, Android cũ / Java trust store fail. Sau cài, kiểm fullchain (fullchain.pem), không chỉ cert.pem.
Renew ≠ installation
Cron ghi file mới lúc 3:00; worker nginx không reload → outage đúng notAfter. Runbook phải có bước reload mọi terminator (nginx, Caddy, ALB listener, Docker reverse proxy).
Wildcard ảo tưởng
*.shop-khach.vn không cover a.b.shop-khach.vn. Cert chỉ www không cover api. Đọc SAN, không chỉ ngày hết hạn.
Staging còn public
Subdomain staging cert LE vẫn valid 90 ngày trên LB cũ = phát hiện pen-test / phishing surface. Rà crt.sh theo domain khách mỗi quý.
Case study (ẩn danh — freelance VN)
Case A — Tết và LE. Dev bàn giao tháng 11, auto-renew fail vì đổi CDN chặn ACME. Giữa kỳ nghỉ site đỏ; khách gọi. Fix: trước lễ dài chạy checklist SSL mọi host + dry-run renew.
Case B — Health check xanh, cert đỏ. Probe hit CDN POP; origin cert hết hạn nhưng edge vẫn phục vụ một thời gian / path khác. Thêm monitor TLS vào hostname apex từ bên ngoài.
Case C — Đổi VPS quên cert. DNS đã trỏ (xem bài DNS) nhưng cert mới self-signed tạm. Khách thấy “xong domain” rồi đỏ HTTPS. Quy trình: DNS đúng và notAfter production CA trước khi báo done.
Case D — Multi-tenant SNI. Một IP, nhiều shop. openssl thiếu -servername hiện nhầm cert default. Luôn truyền SNI đúng hostname khách.
Inventory tối thiểu (thay spreadsheet chết)
Giữ file máy đọc được (YAML/CSV trong repo nội bộ):
- Hostname + mọi SAN
- Issuer (Let’s Encrypt, DigiCert, AutoSSL…)
- Auto vs manual renew
- Chỗ terminate TLS (nginx trên VPS, CF, LB)
Script tuần: export notAfter mọi host production → diff. Spreadsheet Google Sheet “nhớ renew” thối sau 2 tháng.
Runbook khi đã đỏ (ngắn)
- Xác nhận hết hạn vs sai cert / SNI (openssl subject + SAN).
- Renew / re-issue ngay (LE) hoặc liên hệ CA (cert trả phí).
- Cài + reload mọi chỗ terminate TLS.
- Verify từ mạng ngoài (4G) và từ SSL Check.
- Postmortem: vì sao monitor im? Thêm alert ngày còn lại và renew fail.
Checklist trước bàn giao / trước nghỉ lễ
- Mọi hostname public có
notAfter> 30 ngày (LE: xác nhận auto-renew healthy) - SAN khớp www / api / admin đang dùng
- fullchain cài đúng; thử thiết bị/mobile
- Cloudflare mode + origin cert thống nhất
- Job renew (timer/panel) thành công trong 2 tuần gần nhất
- Sau renew thử: có bước reload trong runbook
- Alert expiry + alert renew — không chỉ HTTP 200
- Status / liên lạc khẩn nếu đang HSTS preload
Cách dùng SSL Check trên Kawa
- Mở Kiểm tra chứng chỉ SSL
- Nhập tên miền (ví dụ
shop-khach.vn— không cầnhttps://) - Bấm kiểm tra — đọc ngày hết hạn và thông tin chứng chỉ
- Lặp với
www.,api.nếu tách host - Nếu sát hạn: ưu tiên sửa auto-renew / reload, không chỉ đặt nhắc Zalo
Phù hợp bước “nhìn nhanh trước deploy” trong checklist — không thay monitoring 24/7 bên ngoài.
FAQ nhanh
SSL và TLS khác gì?
Tên thông dụng vẫn nói “SSL”; giao thức hiện tại là TLS 1.2/1.3. Cert dùng cho cả hai cách gọi.
Cert bị thu hồi (revoke) thì sao?
Cảnh báo giống hết hạn. Key lộ → revoke + rotate, không chờ notAfter.
Nội bộ mTLS có cùng kỷ luật không?
Có — chu kỳ còn ngắn hơn (mesh). Site public xanh không chứng minh east-west còn sống.
Chỉ cần mua cert 1–2 năm?
Vẫn cần calendar + reload. LE rẻ/ miễn phí nhưng đòi automation; cert trả phí vẫn outage nếu quên cài lại.
Liên kết liên quan
- Công cụ SSL Check — hạn và thông tin cert theo domain
- DNS Check — xác nhận trỏ đúng host trước khi soi TLS
- Danh sách công cụ