Tự động gia hạn SSL với Certbot khi dùng Cloudflare (DNS Challenge)

Ở bài trước, chúng ta đã cài đặt SSL miễn phí trên Ubuntu 24.04 với Certbot theo phương thức HTTP challenge. Tuy nhiên, nếu bạn đang dùng Cloudflare làm proxy (mũi tên cam), chứng chỉ sẽ không tự gia hạn được — vì Cloudflare chặn request xác thực từ Let’s Encrypt đến server thật của bạn.

Tự động gia hạn SSL với Certbot khi dùng Cloudflare (DNS Challenge)

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 root trê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.

Edit policy

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


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...