- Yêu cầu
- Bước 1: Cài plugin certbot-dns-cloudflare
- Bước 2: Tạo API Token trên Cloudflare
- Bước 3: Tạo file credentials
- Bước 4: Cập nhật renewal config — không cần issue lại cert
- Bước 5: Test dry-run
- Bước 6: Thêm deploy hook để reload Nginx sau khi gia hạn
- Bước 7: Kiểm tra timer tự động
- Xử lý cert của domain cũ không còn dùng
- Kiểm tra trạng thái tổng thể
- Tóm tắt
Giải pháp là chuyển sang DNS challenge thông qua Cloudflare API. Thay vì xác thực qua HTTP, Certbot sẽ tự động tạo một TXT record trên DNS để Let’s Encrypt xác minh — hoàn toàn bypass được Cloudflare proxy. Bài này hướng dẫn quy trình đã được test thành công thực tế.
Yêu cầu
- Đã cài Certbot theo bài hướng dẫn trước
- Domain đang dùng Cloudflare làm nameserver
- Có quyền truy cập Cloudflare Dashboard để tạo API Token
- Quyền
roottrên server Ubuntu 24.04
Bước 1: Cài plugin certbot-dns-cloudflare
apt install python3-certbot-dns-cloudflare -y
Bước 2: Tạo API Token trên Cloudflare
Truy cập Cloudflare Dashboard → Manage account → Account API tokens → Create Token.
Cấu hình permissions như sau:
Zone → DNS → Edit
Zone → Zone → Read
Ở phần Zone Resources, chọn Include → Specific zone và chọn đúng domain của bạn. Không nên chọn “All zones” để đảm bảo bảo mật.

Bước 3: Tạo file credentials
mkdir -p /root/.secrets
nano /root/.secrets/cloudflare.ini
Nội dung file:
dns_cloudflare_api_token = TOKEN_CUA_BAN
Phân quyền file — bắt buộc, Certbot sẽ từ chối chạy nếu file này có quyền quá rộng:
chmod 600 /root/.secrets/cloudflare.ini
Bước 4: Cập nhật renewal config — không cần issue lại cert
Đây là bước quan trọng nhất. Bạn không cần xóa cert cũ hay issue lại từ đầu — chỉ cần sửa file renewal config để Certbot dùng DNS challenge từ lần gia hạn tiếp theo.
Xem file config hiện tại:
cat /etc/letsencrypt/renewal/yourdomain.com.conf
Mở file để chỉnh sửa:
nano /etc/letsencrypt/renewal/yourdomain.com.conf
Trong section [renewalparams], thay thế các dòng authenticator cũ và thêm cấu hình Cloudflare:
# Xóa hoặc comment các dòng này nếu có:
# authenticator = nginx
# authenticator = webroot
# webroot_path = /var/www/html
# Thêm các dòng sau:
authenticator = dns-cloudflare
dns_cloudflare_credentials = /root/.secrets/cloudflare.ini
dns_cloudflare_propagation_seconds = 60
Giữ nguyên các dòng còn lại như account, installer, key_type, server.
Tại sao cần propagation_seconds = 60? Sau khi Certbot tạo TXT record, DNS cần thời gian để propagate. Mặc định Certbot chỉ chờ 10 giây — quá ngắn với Cloudflare, dễ dẫn đến lỗi xác thực. Đặt 60 giây sẽ ổn định hơn nhiều.
Bước 5: Test dry-run
certbot renew --dry-run --verbose
Nếu thấy thông báo “Congratulations, all simulated renewals succeeded” là cấu hình đã đúng. Flag --verbose giúp bạn thấy rõ Certbot đang dùng authenticator nào và bắt lỗi sớm hơn nếu có vấn đề.
Bước 6: Thêm deploy hook để reload Nginx sau khi gia hạn
Certbot gia hạn xong nhưng Nginx vẫn đang dùng cert cũ nếu không reload. Tạo một deploy hook để tự động xử lý việc này:
nano /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
Nội dung:
#!/bin/bash
systemctl reload nginx
Phân quyền thực thi:
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
Deploy hook này sẽ chạy tự động mỗi khi có cert được gia hạn thành công.
Bước 7: Kiểm tra timer tự động
Certbot trên Ubuntu sử dụng systemd timer để tự động gia hạn 2 lần mỗi ngày:
systemctl status certbot.timer
Kết quả mong đợi:
● certbot.timer - Run certbot twice daily
Active: active (waiting)
Nếu timer chưa được bật:
systemctl enable --now certbot.timer
Cert chỉ thực sự được gia hạn khi còn dưới 30 ngày — timer chạy 2 lần/ngày để đảm bảo không bỏ sót.
Xử lý cert của domain cũ không còn dùng
Nếu server từng cài cert cho các domain đã xóa hoặc không còn trỏ về server nữa, certbot renew sẽ fail vì không thể xác thực các domain đó. Kiểm tra danh sách cert hiện có:
certbot certificates
Xóa từng cert không còn cần thiết:
certbot delete --cert-name domain-cu.com
Sau đó chạy lại --dry-run để xác nhận tất cả cert còn lại đều pass.
Kiểm tra trạng thái tổng thể
# Xem tất cả cert và ngày hết hạn
certbot certificates
# Xem lịch gia hạn tiếp theo
systemctl list-timers certbot*
Tóm tắt
Sau khi hoàn thành, Certbot sẽ tự động gia hạn toàn bộ cert thông qua Cloudflare DNS API mà không cần can thiệp thủ công — kể cả khi Cloudflare proxy đang bật ở chế độ Full (Strict). Toàn bộ quá trình từ tạo TXT record, xác thực với Let’s Encrypt, đến reload Nginx đều được xử lý tự động.
Bình luận