Vấn đềKhông gì làm mất lòng tin của người dùng nhanh hơn cảnh báo đỏ khổng lồ "Kết nối của bạn không phải là riêng tư" (Your connection is not private). Bạn thấy lỗi NET::ERR_CERT_DATE_INVALID khi trình duyệt nhận ra chứng chỉ SSL của bạn đã hết hạn hoặc chưa có hiệu lực. Chứng chỉ Let’s Encrypt có thời hạn trong 90 ngày. Certbot thường cố gắng gia hạn vào mốc 60 ngày, nhưng nếu quá trình đó gặp trục trặc trong suốt 30 ngày liên tục, trang web của bạn cuối cùng sẽ bị ngưng hoạt động.
Khi khách truy cập vào trang của bạn, họ sẽ bị chặn bởi mã lỗi cụ thể này của trình duyệt:
NET::ERR_CERT_DATE_INVALID
Tóm tắt: Cứu hộ khẩn cấpTrang web của bạn đang bị sập? Hãy ép buộc gia hạn thủ công và khởi động lại web server để áp dụng các tệp mới:
# Thử gia hạn tất cả chứng chỉ ngay lập tức
sudo certbot renew
# Tải lại web server để nhận các tệp .pem mới
sudo systemctl reload nginx # Sử dụng 'apache2' nếu dùng Apache
Nếu certbot renew báo lỗi thay vì hiển thị "Congratulations," bạn đang gặp vấn đề về cấu hình hệ thống.
Tại sao tính năng tự động gia hạn thường thất bại### 1. Bẫy "Chỉ HTTPS" (Cổng 80 bị đóng)HTTP-01 challenge của Certbot là phương pháp xác thực phổ biến nhất. Nó cần đặt một tệp tạm thời trong .well-known/acme-challenge/ và truy cập tệp đó qua cổng 80. Nhiều quản trị viên đóng cổng 80 vì nghĩ rằng họ chỉ cần cổng 443 cho HTTPS, nhưng Let's Encrypt vẫn cần cổng 80 để xác minh bạn sở hữu tên miền.
2. "Bóng ma" trong RAM (Thiếu các Hook)Thành công trên đĩa cứng không phải lúc nào cũng có nghĩa là thành công trên trình duyệt. Certbot có thể lưu chứng chỉ mới toanh vào /etc/letsencrypt/live/, nhưng Nginx vẫn giữ chứng chỉ cũ đã hết hạn trong bộ nhớ đệm (cache). Nếu bạn không yêu cầu Nginx tải lại, nó sẽ tiếp tục cung cấp chứng chỉ đã chết cho đến khi tiến trình được khởi động lại.
3. Mất kết nối DNSBạn có mới chuyển sang một VPS mới vào tháng trước không? Nếu các bản ghi A hoặc AAAA của bạn trỏ đến một địa chỉ IP cũ, máy chủ xác thực của Let's Encrypt sẽ tìm không đúng chỗ. Quá trình gia hạn sẽ bị quá hạn (timeout) hoặc trả về lỗi 404.
4. Lỗi Cron âm thầmHầu hết các bản phân phối Linux sử dụng một systemd timer để kiểm tra việc gia hạn hai lần mỗi ngày. Nếu một bản cập nhật gói phần mềm che lấp timer này hoặc làm hỏng crontab, quá trình tự động hóa sẽ đơn giản là ngừng chạy mà không bao giờ gửi cảnh báo cho bạn.
Hướng dẫn khắc phục sự cố từng bước### Bước 1: Kiểm tra ngày hết hạn thực tếĐừng tin vào bộ nhớ đệm của trình duyệt. Hãy lấy thông tin ngày tháng trực tiếp từ chứng chỉ trên máy chủ của bạn:
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com | openssl x509 -noout -dates
Hãy nhìn vào dòng notAfter. Nếu ngày đó đã trôi qua, quá trình gia hạn của bạn chắc chắn đã không được kích hoạt.
Bước 2: Kiểm tra tường lửa (Firewall)Đảm bảo cổng 80 được mở rộng rãi cho công chúng. Nếu bạn sử dụng UFW trên Ubuntu, hãy kiểm tra trạng thái của bạn:
sudo ufw allow 80/tcp
sudo ufw reload
Nếu bạn đang sử dụng AWS, hãy kiểm tra lại Security Groups. Bạn cần một Inbound Rule cho HTTP (80) từ nguồn 0.0.0.0/0.
Bước 3: Chạy thử nghiệm để gỡ lỗi (Dry Run)Tham số --dry-run là người bạn tốt nhất của bạn. Nó mô phỏng việc gia hạn mà không làm ảnh hưởng đến giới hạn tốc độ nghiêm ngặt của Let's Encrypt:
sudo certbot renew --dry-run
Theo dõi kết quả đầu ra để tìm các dấu hiệu cảnh báo cụ thể sau:
- "Timeout during connect": Tường lửa của bạn có khả năng vẫn đang chặn cổng 80.- "404 Not Found": Chỉ thị
roottrong cấu hình Nginx của bạn có thể đang trỏ sai thư mục chứa các tệp challenge.- "DNS problem: NXDOMAIN": Tên miền của bạn không được phân giải chính xác.### Bước 4: Dọn dẹp cấu hình NginxĐảm bảo khối server cổng 80 của bạn không vô tình chặn các thư mục ẩn. Một cấu hình tiêu chuẩn, thân thiện với Certbot trông như thế này:
server {
listen 80;
server_name yourdomain.com;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
# Redirect everything else to HTTPS
location / {
return 301 https://$host$request_uri;
}
}
Bước 5: Thiết lập một lần với Post-HooksĐể đảm bảo lỗi NET::ERR_CERT_DATE_INVALID không bao giờ quay lại, hãy tự động hóa việc tải lại máy chủ. Bạn có thể thêm một --deploy-hook, tham số này chỉ chạy nếu việc gia hạn thực sự thành công. Cách này hiệu quả hơn một post-hook chạy mỗi khi timer kiểm tra.
sudo certbot renew --deploy-hook "systemctl reload nginx"
Lệnh này sẽ tự động cập nhật tệp cấu hình gia hạn của bạn trong /etc/letsencrypt/renewal/.
Xác minh kết quảSau khi gia hạn thành công, hãy sử dụng curl để xác minh ngày hết hạn mới từ dòng lệnh:
curl -vI https://yourdomain.com 2>&1 | grep -i "expire date"
Cuối cùng, hãy đảm bảo systemd timer thực sự được lên lịch để chạy lại:
systemctl list-timers | grep certbot
Nếu bạn thấy một ngày trong tương lai dưới cột "NEXT", bạn đã hoàn tất. Chứng chỉ của bạn giờ đây sẽ luôn được cập nhật mới mà không cần can thiệp thủ công.

