Tạo chứng chỉ SSL Wildcard cho Subdomain với Cloudflare và Docker

Hướng dẫn chi tiết cách tạo chứng chỉ SSL Wildcard miễn phí từ Let's Encrypt cho mọi Subdomain tự động thông qua DNS Challenge của Cloudflare và Docker.

Tạo chứng chỉ SSL Wildcard cho Subdomain với Cloudflare và Docker

Let’s Encrypt giúp bạn dễ dàng tạo và cài đặt chứng chỉ bảo mật SSL miễn phí bằng ứng dụng khách Certbot (ACME) trên các máy chủ web. Nhưng có một bài toán đặt ra: Nếu bạn có rất nhiều subdomain (tên miền phụ) và muốn dùng chung một chứng chỉ SSL mà không cần phải tạo mới nhiều lần cho mỗi subdomain thì phải làm như thế nào?

Giải pháp chính là tạo một chứng chỉ SSL Wildcard (có dạng *.domain.com). Bài viết này TechCoBan sẽ chia sẻ với các bạn cách đơn giản nhất để làm điều này thông qua phương thức DNS Challenge kết hợp với CloudflareDocker.

1. Cơ chế DNS Challenge hoạt động như thế nào?

Thay vì xác thực quyền sở hữu tên miền bằng cách đặt một file HTTP lên web server (phương thức HTTP-01 truyền thống), Let’s Encrypt sẽ yêu cầu bạn chứng minh quyền sở hữu thông qua DNS.

Tóm tắt các bước hoạt động của phương thức xác thực DNS (DNS-01 Challenge):

  1. Certbot gửi yêu cầu cấp chứng chỉ từ máy chủ Let’s Encrypt.
  2. Máy chủ Let’s Encrypt trả về một nội dung chuỗi ký tự ngẫu nhiên (challenge string).
  3. Plugin Cloudflare của Certbot sẽ tự động kết nối vào tài khoản Cloudflare của bạn qua API và tạo một bản ghi DNS TXT chứa chuỗi ký tự đó.
  4. Máy chủ Let’s Encrypt kiểm tra và xác thực bản ghi DNS TXT này trên Internet.
  5. Nếu khớp, Let’s Encrypt sẽ cấp chứng chỉ SSL Wildcard và plugin sẽ tự dọn dẹp bản ghi TXT đã tạo.

2. Các bước thực hiện chi tiết

Yêu cầu chuẩn bị:

  • Một server (VPS, Máy ảo hoặc máy cá nhân) đã cài đặt sẵn Docker.
  • Domain của bạn đã được trỏ NameServer và quản lý DNS thông qua Cloudflare.
  • (Trong bài viết này, mình sẽ dùng domain ảo techcoban.com làm ví dụ).

Bước 1: Tạo thư mục lưu trữ chứng chỉ trên Server

Đầu tiên, bạn cần tạo các thư mục để lưu trữ file chứng chỉ trên server (để ánh xạ vào Docker).

sudo mkdir -p /etc/letsencrypt
sudo mkdir -p /var/lib/letsencrypt

Bước 2: Lấy API Token từ Cloudflare

Để Certbot có quyền tự động tạo bản ghi DNS TXT, nó cần một API Token từ Cloudflare.

  1. Đăng nhập vào trang quản trị Cloudflare Dashboard.
  2. Nhấn vào biểu tượng Profile góc trên bên phải -> Chọn My Profile -> Chọn tab API Tokens.
  3. Bấm Create Token -> Chọn template Edit zone DNS (hoặc Custom Token cấp quyền Zone.DNS.Edit).
  4. Chọn đúng tên miền bạn muốn tạo chứng chỉ ở mục Zone Resources.
  5. Bấm Continue to summaryCreate Token.
  6. Lưu lại chuỗi API Token này (vì nó chỉ hiện ra một lần duy nhất).

Bước 3: Tạo file cấu hình thông tin Cloudflare

Tạo một file có tên cloudflare.ini trên server để lưu trữ Token vừa lấy.

sudo nano /etc/letsencrypt/cloudflare.ini

Điền nội dung API Token của bạn vào file theo định dạng sau:

dns_cloudflare_api_token = 0123456789abcdef0123456789abcdef01234567

Lưu lại và cấu hình bảo mật cực kỳ nghiêm ngặt cho file này (vì nếu lộ token, người khác có quyền sửa DNS của bạn):

sudo chmod 600 /etc/letsencrypt/cloudflare.ini

Bước 4: Chạy Docker Certbot để tạo chứng chỉ SSL Wildcard

Tiếp theo, bạn chạy câu lệnh Docker sau để tiến hành xin cấp chứng chỉ cho tên miền chính và toàn bộ subdomain *.techcoban.com:

docker run -it --rm --name certbot \
  -v "/etc/letsencrypt:/etc/letsencrypt" \
  -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
  certbot/dns-cloudflare \
  certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
  --dns-cloudflare-propagation-seconds 60 \
  -d "*.techcoban.com" \
  -d "techcoban.com"

Quá trình cài đặt:

  • Khi chạy lần đầu, Certbot sẽ hỏi email của bạn (để gửi thông báo khi SSL sắp hết hạn).
  • Nhập Y (Yes) cho các câu hỏi đồng ý với điều khoản sử dụng.
  • Certbot sẽ chờ khoảng 60 giây để DNS TXT lan truyền trên internet, sau đó xác nhận thành công.

Sau khi hoàn tất, toàn bộ các file chứng chỉ (bao gồm fullchain.pemprivkey.pem) sẽ được lưu tại:

/etc/letsencrypt/live/techcoban.com/

Bước 5: Sử dụng chứng chỉ

Bây giờ bạn đã có một chứng chỉ SSL Wildcard hợp lệ. Bạn có thể chép nó hoặc trỏ đường dẫn trực tiếp vào cấu hình của Nginx, Traefik, hay Apache để sử dụng cho mọi Subdomain (ví dụ: app.techcoban.com, api.techcoban.com) mà không cần tạo mới nữa!

3. Lưu ý quan trọng (Tự động gia hạn)

Chứng chỉ của Let’s Encrypt sẽ hết hạn sau mỗi 3 tháng (90 ngày). Do đó, để hệ thống tự động gia hạn trước khi hết hạn, bạn nên tạo một lịch trình Cron (Crontab) trên server như sau:

Mở Crontab:

sudo crontab -e

Thêm dòng sau vào cuối file để chạy gia hạn tự động vào lúc 2 giờ sáng mỗi ngày (Certbot sẽ tự kiểm tra, nếu còn dưới 30 ngày nó mới tiến hành renew):

0 2 * * * docker run --rm --name certbot -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" certbot/dns-cloudflare renew --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini > /dev/null 2>&1

Chúc các bạn thành công! Nếu có thắc mắc gì trong quá trình cài đặt, hãy để lại câu hỏi nhé.

Bình luận

Bài viết liên quan