Cài SSL Let’s Encrypt bằng Certbot là cách nhanh nhất để chuyển website từ HTTP sang HTTPS mà không tốn phí chứng chỉ. Nếu bạn đang chạy VPS với Nginx hoặc Apache và chưa biết bắt đầu từ đâu, bài viết này của InterData sẽ đi thẳng vào từng lệnh cụ thể — từ cài đặt, cấu hình đến tự động gia hạn và xử lý lỗi thường gặp.
NỘI DUNG BÀI VIẾT
- 1. Certbot và Let’s Encrypt là gì?
- 2. Điều kiện tiên quyết trước khi cài SSL bằng Certbot
- 3. Hướng dẫn cài SSL Let’s Encrypt bằng Certbot trên Nginx
- 4. Hướng dẫn cài SSL Let’s Encrypt bằng Certbot trên Apache
- 5. Tự động gia hạn SSL Let’s Encrypt — Certbot renew và cron job
- 6. Cài wildcard SSL Let’s Encrypt bằng DNS challenge
- 7. So sánh các mode Certbot: Nginx plugin, Apache plugin, Standalone, Webroot
- 8. Lỗi thường gặp khi cài SSL bằng Certbot và cách khắc phục
- 9. So sánh VPS và Cloud Server khi host website cần SSL
- 10. Câu hỏi thường gặp về SSL Let’s Encrypt và Certbot
Certbot và Let’s Encrypt là gì?
Let’s Encrypt là tổ chức cấp chứng chỉ SSL miễn phí, hoạt động phi lợi nhuận dưới sự bảo trợ của ISRG (Internet Security Research Group). Mỗi chứng chỉ có thời hạn 90 ngày và được cấp tự động qua ACME protocol (RFC 8555) — không cần gửi email, không cần xác minh thủ công.
Certbot là công cụ dòng lệnh mã nguồn mở do EFF (Electronic Frontier Foundation) phát triển, đóng vai trò ACME client. Nói đơn giản: Certbot giao tiếp với Let’s Encrypt để yêu cầu, xác minh và cài đặt chứng chỉ SSL lên server của bạn. Certbot hỗ trợ sẵn plugin cho Nginx và Apache — tự động chỉnh cấu hình web server để bật HTTPS.
Quy trình hoạt động cốt lõi: Certbot tạo CSR (Certificate Signing Request) → gửi challenge xác minh quyền sở hữu domain (HTTP-01 hoặc DNS-01) → Let’s Encrypt cấp chứng chỉ → Certbot lưu file fullchain.pem và privkey.pem vào thư mục /etc/letsencrypt/live/domain/ → cấu hình web server trỏ tới file chứng chỉ.

Điều kiện tiên quyết trước khi cài SSL Let’s Encrypt bằng Certbot
Bỏ qua bước này là nguyên nhân số một khiến Certbot báo lỗi. Trước khi chạy bất kỳ lệnh nào, đảm bảo đủ 5 điều kiện sau:
- VPS hoặc server có quyền root (sudo) — Shared Hosting thường không cho phép cài Certbot vì không có quyền root và không truy cập được cấu hình web server.
- Domain đã trỏ bản ghi A/AAAA về đúng IP server — Certbot cần xác minh quyền sở hữu domain. Nếu DNS chưa propagate xong, challenge sẽ thất bại. Kiểm tra bằng lệnh
dig +short yourdomain.comhoặcnslookup yourdomain.com. - Web server (Nginx hoặc Apache) đã cài đặt và đang chạy — Nếu chưa cài Nginx, tham khảo hướng dẫn cài đặt Nginx trên Ubuntu/CentOS.
- Port 80 (HTTP) và port 443 (HTTPS) đã mở trên tường lửa (firewall) — Certbot dùng HTTP-01 challenge qua port 80. Nếu port bị chặn, challenge thất bại ngay lập tức.
- Server block (Nginx) hoặc VirtualHost (Apache) đã cấu hình cho domain — Certbot cần tìm đúng cấu hình của domain để chèn đường dẫn chứng chỉ.
Kiểm tra nhanh port 80 và 443 trên Ubuntu (UFW):
# Kiểm tra trạng thái firewall
sudo ufw status
# Mở port 80 và 443 nếu chưa mở
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Trên CentOS/AlmaLinux (firewalld):
# Mở port 80 và 443
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Hướng dẫn cài SSL Let’s Encrypt bằng Certbot trên Nginx
Phần này dành cho server chạy Nginx. Certbot có plugin riêng cho Nginx — tự động tìm server block, cài chứng chỉ và cấu hình redirect HTTP → HTTPS.
Bước 1: Cài Certbot và plugin Nginx
Trên Ubuntu 20.04/22.04/24.04 (cài qua Snap — khuyên dùng theo tài liệu chính thức certbot.eff.org):
# Gỡ certbot cũ (nếu có) để tránh xung đột
sudo apt remove certbot -y
# Cài Snap core và cập nhật
sudo snap install core; sudo snap refresh core
# Cài Certbot qua Snap
sudo snap install --classic certbot
# Tạo symlink để gọi certbot từ bất kỳ đâu
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Trên CentOS 8/AlmaLinux 8+ (EPEL + dnf):
# Cài EPEL repository
sudo dnf install epel-release -y
# Cài Certbot và plugin Nginx
sudo dnf install certbot python3-certbot-nginx -y
Bước 2: Kiểm tra cấu hình server block Nginx
Certbot cần tìm đúng server_name trong file cấu hình Nginx. Mở file config domain của bạn (thường nằm ở /etc/nginx/sites-available/ trên Ubuntu hoặc /etc/nginx/conf.d/ trên CentOS):
# Mở file config (thay yourdomain.com bằng domain thật)
sudo nano /etc/nginx/sites-available/yourdomain.com
Đảm bảo dòng server_name khớp chính xác với domain bạn muốn cài SSL:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/yourdomain.com/html;
index index.html index.htm;
}
Kiểm tra cú pháp Nginx và reload — đây là lệnh Linux cơ bản cần nắm khi quản trị server:
# Kiểm tra cú pháp config
sudo nginx -t
# Reload Nginx nếu không có lỗi
sudo systemctl reload nginx
Bước 3: Chạy Certbot cài SSL cho Nginx
# Cài SSL và tự động cấu hình Nginx
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Certbot sẽ hỏi email (để nhận thông báo hết hạn), đồng ý điều khoản dịch vụ, và hỏi có muốn redirect toàn bộ HTTP sang HTTPS không. Chọn redirect (option 2) để mọi request HTTP tự động chuyển sang HTTPS.
Sau khi chạy xong, Certbot tự động thêm block SSL vào file config Nginx, trỏ tới fullchain.pem và privkey.pem trong /etc/letsencrypt/live/yourdomain.com/.
Bước 4: Kiểm tra SSL đã hoạt động
# Kiểm tra chứng chỉ qua OpenSSL
echo | openssl s_client -servername yourdomain.com -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates
Hoặc truy cập https://yourdomain.com trên trình duyệt — biểu tượng ổ khóa xuất hiện nghĩa là SSL đã cài thành công. Dùng SSL Labs để kiểm tra chi tiết cấu hình SSL.
Hướng dẫn cài SSL Let’s Encrypt bằng Certbot trên Apache
Quy trình tương tự Nginx nhưng dùng plugin Apache. Certbot sẽ chỉnh file VirtualHost thay vì server block.
Bước 1: Cài Certbot và plugin Apache
Trên Ubuntu 20.04/22.04/24.04 (Snap):
# Gỡ certbot cũ, cài qua Snap
sudo apt remove certbot -y
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Trên CentOS 8/AlmaLinux 8+:
sudo dnf install epel-release -y
sudo dnf install certbot python3-certbot-apache -y
Bước 2: Kiểm tra VirtualHost Apache
File VirtualHost thường nằm ở /etc/apache2/sites-available/ (Ubuntu) hoặc /etc/httpd/conf.d/ (CentOS). Đảm bảo ServerName khớp domain:
<VirtualHost *:80>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
DocumentRoot /var/www/yourdomain.com/html
</VirtualHost>
# Kiểm tra cú pháp Apache
# Ubuntu:
sudo apache2ctl configtest
# CentOS:
sudo apachectl configtest
# Reload Apache
# Ubuntu:
sudo systemctl reload apache2
# CentOS:
sudo systemctl reload httpd
Bước 3: Chạy Certbot cài SSL cho Apache
# Cài SSL và tự động cấu hình Apache
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com
Certbot tạo file VirtualHost mới cho port 443, bật module ssl và rewrite của Apache, chèn đường dẫn chứng chỉ và thiết lập redirect HTTP → HTTPS. Kiểm tra kết quả tương tự phần Nginx: truy cập https://yourdomain.com và xác nhận ổ khóa hiển thị.
Săn deal VPS & Cloud Server trước khi chốt gói
Canh Me tổng hợp khuyến mãi, mã giảm giá và hot deal VPS, Cloud Server mới nhất của InterData — xem trước để chọn gói phù hợp với chi phí tốt nhất trước khi cài SSL.
Tự động gia hạn SSL Let’s Encrypt — Certbot renew và cron job
Chứng chỉ Let’s Encrypt chỉ có hạn 90 ngày. Nếu quên gia hạn, website sẽ hiển thị cảnh báo “Kết nối không an toàn” trên trình duyệt. Certbot cài qua Snap tự động tạo systemd timer để renew, nhưng bạn nên kiểm tra và đảm bảo cơ chế này hoạt động đúng.
Kiểm tra systemd timer (Snap)
# Kiểm tra timer Certbot đã active chưa
sudo systemctl list-timers | grep certbot
# Nếu thấy snap.certbot.renew.timer → timer đang chạy, Certbot sẽ tự gia hạn
Thêm cron job thủ công (nếu cài qua apt/dnf)
Nếu cài Certbot bằng apt hoặc dnf (không qua Snap), có thể không có systemd timer. Thêm cron job để chạy renew 2 lần/ngày (Certbot chỉ renew khi chứng chỉ còn dưới 30 ngày):
# Mở crontab
sudo crontab -e
# Thêm dòng sau (chạy lúc 3:30 sáng và 3:30 chiều mỗi ngày)
30 3,15 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"
Thay systemctl reload nginx bằng systemctl reload apache2 (Ubuntu) hoặc systemctl reload httpd (CentOS) nếu dùng Apache. Flag --deploy-hook chỉ chạy lệnh reload khi có chứng chỉ mới được cấp — tránh reload web server không cần thiết.
Test thử gia hạn với –dry-run
# Mô phỏng gia hạn mà không tạo chứng chỉ thật
sudo certbot renew --dry-run
Nếu output hiển thị Congratulations, all simulated renewals succeeded → cơ chế auto-renew hoạt động bình thường. Nếu báo lỗi, kiểm tra port 80 có đang mở và web server có đang chạy không.
Cài wildcard SSL Let’s Encrypt bằng DNS challenge
Wildcard SSL bảo vệ tất cả subdomain cùng cấp: *.yourdomain.com — nghĩa là blog.yourdomain.com, shop.yourdomain.com, api.yourdomain.com đều dùng chung một chứng chỉ. Certbot hỗ trợ cấp wildcard SSL nhưng bắt buộc dùng DNS-01 challenge (không dùng HTTP-01 được).
Lệnh cài wildcard SSL
# Yêu cầu wildcard SSL bằng DNS challenge
sudo certbot certonly --manual --preferred-challenges=dns -d "*.yourdomain.com" -d yourdomain.com
Certbot sẽ yêu cầu bạn tạo bản ghi TXT tại DNS zone của domain. Ví dụ:
_acme-challenge.yourdomain.com TXT "chuỗi_ký_tự_ngẫu_nhiên_certbot_cung_cấp"
Thêm bản ghi TXT này vào DNS provider (Cloudflare, NameCheap, Route53…), đợi DNS propagate (thường 1–5 phút), rồi nhấn Enter để Certbot xác minh. Sau khi cấp xong, bạn cần tự cấu hình web server trỏ tới file chứng chỉ vì mode certonly không tự động chỉnh config.
Lưu ý quan trọng: Với mode --manual, Certbot không tự động gia hạn vì cần thêm bản ghi TXT mới mỗi lần renew. Để tự động hóa, dùng DNS plugin tương ứng với provider (ví dụ: certbot-dns-cloudflare, certbot-dns-route53). Tham khảo danh sách plugin tại tài liệu chính thức Certbot.
So sánh các mode Certbot: Nginx plugin, Apache plugin, Standalone, Webroot
Certbot cung cấp nhiều cách xác minh và cài chứng chỉ. Chọn mode nào phụ thuộc vào web server bạn đang chạy và liệu có thể dừng dịch vụ web hay không.
| Mode | Lệnh | Khi nào dùng | Lưu ý |
|---|---|---|---|
| Nginx plugin | certbot --nginx |
Server chạy Nginx, muốn tự động cài + cấu hình SSL | Tự sửa config Nginx. Nên backup config trước. |
| Apache plugin | certbot --apache |
Server chạy Apache, muốn tự động cài + cấu hình SSL | Tự tạo VirtualHost cho port 443. Nên backup config trước. |
| Standalone | certbot certonly --standalone |
Không chạy Nginx/Apache, hoặc muốn tự cấu hình thủ công | Certbot tự dựng web server tạm trên port 80. Phải dừng Nginx/Apache trước. |
| Webroot | certbot certonly --webroot -w /var/www/html |
Không muốn dừng web server, không muốn Certbot sửa config | Đặt file xác minh vào webroot. Phải chỉ đúng thư mục root. |
Khuyên dùng: Nếu server chỉ chạy Nginx hoặc Apache, dùng plugin tương ứng (--nginx hoặc --apache) vì Certbot xử lý toàn bộ từ xác minh đến cấu hình. Dùng standalone khi server chạy ứng dụng khác trên port 80 (mail server, reverse proxy không phải Nginx/Apache). Dùng webroot khi bạn muốn kiểm soát hoàn toàn cấu hình web server và không muốn Certbot tự sửa config.
Lỗi thường gặp khi cài SSL bằng Certbot và cách khắc phục
Dưới đây là các lỗi phổ biến nhất mà sysadmin và chủ website gặp phải khi cài SSL Let’s Encrypt bằng Certbot, kèm nguyên nhân và cách sửa cụ thể.
Lỗi 1: Port 80 bị chặn — Challenge failed
Biểu hiện: Certbot báo Connection refused hoặc urn:ietf:params:acme:error:connection.
Nguyên nhân: Port 80 chưa mở trên firewall, hoặc có dịch vụ khác chiếm port 80.
# Kiểm tra port 80 đang bị process nào chiếm
sudo ss -tlnp | grep :80
# Mở port 80 trên UFW (Ubuntu)
sudo ufw allow 80/tcp
# Mở port 80 trên firewalld (CentOS)
sudo firewall-cmd --permanent --add-service=http && sudo firewall-cmd --reload
Lỗi 2: certbot — command not found
Nguyên nhân: Certbot chưa cài, hoặc cài qua Snap nhưng chưa tạo symlink.
# Kiểm tra Certbot đã cài chưa
which certbot
# Nếu cài bằng Snap mà thiếu symlink
sudo ln -s /snap/bin/certbot /usr/bin/certbot
# Nếu chưa cài, cài lại
sudo snap install --classic certbot
Lỗi 3: Domain chưa trỏ về IP server
Biểu hiện: Certbot báo DNS problem: NXDOMAIN looking up A for yourdomain.com hoặc trả về IP sai.
# Kiểm tra DNS đã trỏ đúng chưa
dig +short yourdomain.com
# Output phải là IP của server VPS
Nếu IP sai hoặc trả về rỗng: vào DNS provider chỉnh bản ghi A, đợi 5–30 phút cho DNS propagate rồi chạy lại Certbot.
Lỗi 4: Nginx/Apache redirect chặn challenge
Biểu hiện: Certbot báo 404 hoặc 403 khi truy cập /.well-known/acme-challenge/.
Nguyên nhân: Config web server redirect toàn bộ request sang HTTPS hoặc sang domain khác trước khi Certbot kịp xác minh. Hoặc có rule chặn truy cập thư mục ẩn.
# Thêm location block trong config Nginx (trước block redirect)
location /.well-known/acme-challenge/ {
root /var/www/html;
allow all;
}
Sau khi thêm, reload Nginx (sudo systemctl reload nginx) rồi chạy lại Certbot.
Lỗi 5: Chứng chỉ hết hạn — auto-renew không chạy
Nguyên nhân phổ biến: Systemd timer bị disable, cron job bị xóa, hoặc port 80 bị chặn lại sau khi cài lần đầu (do thay đổi firewall rule).
# Kiểm tra timer có active không
sudo systemctl list-timers | grep certbot
# Gia hạn thủ công ngay
sudo certbot renew --force-renewal
# Test dry-run sau khi sửa
sudo certbot renew --dry-run
So sánh VPS và Cloud Server khi host website cần SSL
Cả VPS và Cloud Server đều cho quyền root để cài Certbot và quản lý SSL. Sự khác biệt nằm ở khả năng mở rộng và quản lý khi số lượng website tăng.
| Tiêu chí | VPS | Cloud Server |
|---|---|---|
| Quyền root cài Certbot | Có | Có |
| Phù hợp số lượng website | 1–5 site | 5+ site, nhiều subdomain |
| Nâng/hạ tài nguyên | Cần liên hệ hoặc nâng gói | Tự nâng/hạ nhanh qua panel |
| Wildcard SSL nhiều subdomain | Được, nhưng tài nguyên có giới hạn | Phù hợp hơn khi traffic mỗi subdomain lớn |
| Chi phí ban đầu | Thấp hơn, dễ bắt đầu | Cao hơn, trả theo tài nguyên sử dụng |
| Nên dùng khi | Mới bắt đầu, 1–5 site, traffic ổn định | Nhiều site, traffic biến động, cần scale nhanh |
Nếu bạn đang chạy 1–3 website với traffic ổn định, VPS đủ dùng và chi phí thấp hơn. Khi số lượng domain tăng, chạy wildcard SSL cho nhiều subdomain hoặc cần tăng CPU/RAM nhanh theo chiến dịch — chuyển sang Cloud Server để không bị giới hạn tài nguyên cố định.
Câu hỏi thường gặp về SSL Let’s Encrypt và Certbot
SSL Let’s Encrypt có miễn phí không?
Có. Let’s Encrypt là Certificate Authority phi lợi nhuận, cấp chứng chỉ DV (Domain Validation) hoàn toàn miễn phí, không giới hạn số lần cấp. Chứng chỉ này mã hóa kết nối giữa trình duyệt và server tương đương SSL trả phí cùng loại DV. Tuy nhiên, Let’s Encrypt không cấp chứng chỉ OV (Organization Validation) hoặc EV (Extended Validation) — loại hiển thị tên tổ chức trên thanh địa chỉ, thường dùng cho ngân hàng, e-commerce lớn.
Chứng chỉ Let’s Encrypt có hạn bao lâu?
90 ngày. Let’s Encrypt thiết kế thời hạn ngắn để khuyến khích tự động hóa gia hạn và giảm rủi ro khi khóa bị lộ. Certbot hỗ trợ auto-renew qua systemd timer hoặc cron job — chứng chỉ được gia hạn tự động khi còn dưới 30 ngày, bạn không cần thao tác thủ công nếu cấu hình đúng.
Certbot có hỗ trợ wildcard SSL không?
Có. Từ phiên bản 0.22.0, Certbot hỗ trợ cấp wildcard SSL (*.yourdomain.com) qua DNS-01 challenge. Bạn cần thêm bản ghi TXT vào DNS zone để xác minh quyền sở hữu. Để tự động gia hạn wildcard, sử dụng DNS plugin tương ứng với provider (Cloudflare, Route53, DigitalOcean…) thay vì mode --manual.
Cài SSL bằng Certbot có cần VPS không?
Về mặt kỹ thuật, Certbot yêu cầu quyền sudo trên server, quyền truy cập cấu hình web server (Nginx/Apache) và khả năng mở port 80/443 trên firewall. Shared Hosting thường không cung cấp những quyền này. Do đó, bạn cần ít nhất một VPS có quyền root để chạy Certbot. Một số control panel trên Shared Hosting tích hợp sẵn Let’s Encrypt (như cPanel, DirectAdmin), nhưng đó là do hosting provider cấu hình sẵn, không phải bạn tự cài Certbot.
Làm sao biết SSL đã cài thành công?
Ba cách nhanh nhất: (1) Truy cập https://yourdomain.com trên trình duyệt — nếu hiển thị ổ khóa, SSL đã hoạt động. (2) Chạy lệnh echo | openssl s_client -servername yourdomain.com -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates để xem ngày hết hạn. (3) Kiểm tra chi tiết cấu hình SSL tại SSL Labs (ssllabs.com/ssltest) — công cụ này chấm điểm từ A đến F và chỉ ra vấn đề cần sửa.
Tổng kết
Cài SSL Let’s Encrypt bằng Certbot không phức tạp nếu bạn chuẩn bị đúng điều kiện tiên quyết: domain đã trỏ IP, web server đang chạy, port 80 và 443 đã mở. Chỉ cần một lệnh sudo certbot --nginx hoặc sudo certbot --apache là website đã chuyển sang HTTPS với chứng chỉ miễn phí. Cấu hình thêm auto-renew qua systemd timer hoặc cron job để không bao giờ lo chứng chỉ hết hạn. Khi số lượng website và subdomain tăng, wildcard SSL qua DNS challenge sẽ giúp quản lý tập trung. Bắt đầu với VPS khi cần toàn quyền cài đặt, nâng lên Cloud Server khi quy mô đòi hỏi.
Sẵn sàng cài SSL miễn phí cho website?
Bắt đầu với VPS để có toàn quyền cấu hình Certbot, Nginx/Apache và firewall. Nâng lên Cloud Server khi cần quản lý nhiều domain — và ghé Canh Me để săn deal trước khi chốt gói.
Nội dung mang tính tham khảo. Các lệnh cài đặt, cấu hình Certbot và Let’s Encrypt có thể thay đổi theo phiên bản Certbot, distro Linux (Ubuntu, CentOS, AlmaLinux), web server (Nginx, Apache) và môi trường thực tế. Luôn kiểm tra tài liệu chính thức tại certbot.eff.org và letsencrypt.org, sao lưu cấu hình trước khi thay đổi và test bằng –dry-run trước khi áp dụng cho production.
