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.
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 Cloudflare và Docker.
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):
- Certbot gửi yêu cầu cấp chứng chỉ từ máy chủ Let’s Encrypt.
- Máy chủ Let’s Encrypt trả về một nội dung chuỗi ký tự ngẫu nhiên (challenge string).
- 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 TXTchứa chuỗi ký tự đó. - Máy chủ Let’s Encrypt kiểm tra và xác thực bản ghi
DNS TXTnày trên Internet. - 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.comlà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.
- Đăng nhập vào trang quản trị Cloudflare Dashboard.
- 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.
- Bấm Create Token -> Chọn template Edit zone DNS (hoặc Custom Token cấp quyền
Zone.DNS.Edit). - Chọn đúng tên miền bạn muốn tạo chứng chỉ ở mục
Zone Resources. - Bấm Continue to summary và Create Token.
- 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.pem và privkey.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
Bảo mật Web Services với Traefik Reverse Proxy
Tìm hiểu về Traefik Reverse Proxy - công cụ Load Balancer hiện đại giúp tự động cấu hình và bảo mật các ứng dụng chạy trên Docker và Kubernetes.
Script tự động xoá Image không gắn Tag (Untagged) trên Amazon ECR
Vấn đề tràn lưu trữ ECR do các Docker Image cũ không gắn tag (untagged). Bài viết chia sẻ Bash Script giúp tự động dọn dẹp hàng loạt Image untagged trên Amazon ECR.
Hướng Dẫn Cập Nhật Tự Động AWS ECR Token Trên Kubernetes Với CronJobs
Token của AWS ECR sẽ hết hạn sau 12 giờ. Bài viết này hướng dẫn chi tiết cách sử dụng Kubernetes CronJobs để tự động gia hạn ECR token, giúp quy trình CI/CD không bị gián đoạn.