Lỗi Gặp Phải
Bạn mở trình duyệt và thay vì thấy website, bạn nhận được thông báo này:
NET::ERR_CERT_DATE_INVALID
The server's security certificate has expired.
Firefox hiển thị theo cách khác:
SEC_ERROR_EXPIRED_CERTIFICATE
Your connection is not secure.
Hầu hết người dùng sẽ không bấm qua cảnh báo đáng sợ đó — họ sẽ rời đi ngay. Website của bạn thực chất đã ngừng hoạt động cho đến khi vấn đề được khắc phục.
Nguyên Nhân
Mỗi chứng chỉ SSL/TLS đều có ngày hết hạn cố định. Chứng chỉ Let's Encrypt hết hạn sau 90 ngày. Chứng chỉ thương mại từ DigiCert hoặc Sectigo có thời hạn 1–2 năm. Một khi qua ngày đó, trình duyệt từ chối kết nối — không có ngoại lệ, không có thời gian gia hạn.
Tại sao chứng chỉ hết hạn mà bạn không hay biết?
- Cron job tự gia hạn bị lỗi mà không có thông báo
- Certbot đã gia hạn chứng chỉ nhưng không reload Nginx/Apache — chứng chỉ cũ vẫn còn trong bộ nhớ
- Cổng 80 hoặc DNS bị lỗi trong lúc thực hiện gia hạn
- Chứng chỉ được cài đặt thủ công mà không thiết lập tự động gia hạn
- Email cảnh báo hết hạn bị lọc vào spam hoặc gửi đến hộp thư không còn hoạt động
Chẩn Đoán Nhanh
Trước khi làm bất cứ điều gì, hãy xác nhận chứng chỉ thực sự đã hết hạn chứ không chỉ bị cấu hình sai.
Kiểm tra ngày hết hạn từ dòng lệnh:
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -dates
Ví dụ kết quả:
notBefore=Jan 1 00:00:00 2024 GMT
notAfter=Apr 1 00:00:00 2024 GMT
Nếu notAfter đã qua, chứng chỉ đã hết hạn. Tiếp theo, tìm file chứng chỉ mà server đang thực sự tải:
# Nginx
grep -r 'ssl_certificate ' /etc/nginx/
# Apache
grep -r 'SSLCertificateFile' /etc/apache2/
Khắc Phục: Let's Encrypt (Certbot)
Let's Encrypt là cấu hình phổ biến nhất. Bắt đầu bằng cách ép buộc gia hạn:
sudo certbot renew --force-renewal
Nếu thành công, reload web server:
# Nginx
sudo systemctl reload nginx
# Apache
sudo systemctl reload apache2
Nếu gia hạn thất bại, chạy với --dry-run để xem lỗi mà không thực hiện thay đổi:
sudo certbot renew --force-renewal --dry-run
Ba nguyên nhân thất bại thường gặp:
- Cổng 80 bị chặn: HTTP-01 challenge của Certbot yêu cầu cổng 80. Mở cổng bằng:
sudo ufw allow 80 - DNS không trỏ đến server này: Tên miền phải phân giải đến IP của server này. Kiểm tra bằng
dig yourdomain.com - Lỗi cấu hình web server: Cấu hình bị hỏng ngăn Certbot phục vụ file challenge. Kiểm tra bằng
sudo nginx -thoặcsudo apachectl configtest
Khắc Phục: Chứng Chỉ Thương Mại hoặc Cài Đặt Thủ Công
Đã mua chứng chỉ từ DigiCert, Sectigo hoặc CA khác? Gia hạn qua bảng điều khiển của họ và cài đặt file mới theo cách thủ công.
Trước tiên, tạo CSR mới:
openssl req -new -newkey rsa:2048 -nodes \
-keyout yourdomain.key \
-out yourdomain.csr \
-subj "/C=US/ST=State/L=City/O=YourOrg/CN=yourdomain.com"
Gửi CSR cho CA của bạn, tải về gói chứng chỉ mới, rồi cập nhật cấu hình server:
# Nginx — cập nhật các đường dẫn này
ssl_certificate /etc/ssl/yourdomain/yourdomain.crt;
ssl_certificate_key /etc/ssl/yourdomain/yourdomain.key;
# Apache — cập nhật các đường dẫn này
SSLCertificateFile /etc/ssl/yourdomain/yourdomain.crt
SSLCertificateKeyFile /etc/ssl/yourdomain/yourdomain.key
SSLCertificateChainFile /etc/ssl/yourdomain/ca-bundle.crt
Reload web server sau khi cập nhật, rồi xác nhận ngày hết hạn mới.
Khắc Phục: Tự Động Gia Hạn Không Hoạt Động
Chín trong mười trường hợp, đây mới là thủ phạm thực sự — job gia hạn đã chạy nhưng có gì đó bị hỏng, hoặc nó chưa bao giờ chạy. Kiểm tra xem systemd timer hay cron job có đang hoạt động không:
# Kiểm tra systemd timer (hầu hết các hệ thống hiện đại)
systemctl status certbot.timer
# Kiểm tra cron
crontab -l
cat /etc/cron.d/certbot
Nếu certbot.timer không hoạt động, hãy kích hoạt nó:
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer
Không có cron entry? Thêm một cái:
sudo crontab -e
# Thêm dòng này:
0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
Flag --post-hook rất quan trọng. Nếu không có nó, Certbot ghi chứng chỉ mới xuống đĩa — nhưng Nginx vẫn tiếp tục phục vụ chứng chỉ cũ từ bộ nhớ. Website vẫn bị lỗi dù về mặt kỹ thuật việc gia hạn đã "thành công".
Xác Nhận Đã Sửa Xong
Chạy lại lệnh kiểm tra ngày hết hạn:
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -dates
notAfter bây giờ phải là ~90 ngày tới (Let's Encrypt) hoặc 1–2 năm (chứng chỉ thương mại).
Kiểm tra toàn bộ chuỗi chứng chỉ:
curl -vI https://yourdomain.com 2>&1 | grep -E 'SSL|expire|issuer'
Hoặc chạy kiểm tra chuỗi đầy đủ tại https://www.ssllabs.com/ssltest/ — công cụ này phát hiện các vấn đề chứng chỉ trung gian mà openssl một mình có thể bỏ sót.
Xóa cache trình duyệt (Ctrl+Shift+Delete) và tải lại. Cảnh báo NET::ERR_CERT_DATE_INVALID sẽ biến mất.
Ngăn Chặn Tái Diễn
- Giám sát hết hạn chứng chỉ: Gói miễn phí của UptimeRobot có thể cảnh báo bạn 30 ngày trước khi hết hạn — chỉ mất khoảng 2 phút để cấu hình
- Kiểm tra tự động gia hạn hàng tháng: Chạy
sudo certbot renew --dry-runmỗi tháng một lần để xác nhận toàn bộ quy trình gia hạn hoạt động tốt - Luôn kèm --post-hook: Lệnh gia hạn phải reload web server khi thành công, nếu không chứng chỉ mới sẽ không bao giờ có hiệu lực
- Xem lại log gia hạn:
cat /var/log/letsencrypt/letsencrypt.log— đặc biệt sau khi cập nhật hệ điều hành có thể thay đổi quy tắc tường lửa hoặc cài đặt DNS - Chú ý email của Certbot: Certbot gửi cảnh báo hết hạn đến địa chỉ đã đăng ký với chứng chỉ. Hãy đảm bảo hộp thư đó còn hoạt động và có người thực sự đọc

