Kiểm hạn SSL trước outage | Freelancer VN hay quên renew

(Cập nhật: 19 tháng 7, 2026 ) SSL TLS chứng chỉ Let's Encrypt hết hạn freelance HTTPS
Kết luận

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 theo dõi SSL
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ế độ failTriệu chứngViệc làm
HTTP-01 bị chặnFirewall, CDN không route /.well-known/acme-challengeMở path challenge hoặc chuyển DNS-01
DNS-01 token cũAPI token DNS xoay, secret cert-manager chưa cập nhậtRotate secret; dry-run staging
Rate limitQuá nhiều order failFix trên staging CA trước
AAAA hỏngA ổn, AAAA trỏ máy chết — LE validate IPv6Sửa/xóa AAAA
Renew OK, chưa reloadFile 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 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)

  1. Xác nhận hết hạn vs sai cert / SNI (openssl subject + SAN).
  2. Renew / re-issue ngay (LE) hoặc liên hệ CA (cert trả phí).
  3. Cài + reload mọi chỗ terminate TLS.
  4. Verify từ mạng ngoài (4G) và từ SSL Check.
  5. Postmortem: vì sao monitor im? Thêm alert ngày còn lại 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

  1. Mở Kiểm tra chứng chỉ SSL
  2. Nhập tên miền (ví dụ shop-khach.vn — không cần https://)
  3. Bấm kiểm tra — đọc ngày hết hạn và thông tin chứng chỉ
  4. Lặp với www., api. nếu tách host
  5. 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