Nếu bạn đang chạy website trên VPS hoặc Dedicated Server với Nginx và chưa có SSL, trong bài này, Cloud360 sẽ hướng dẫn toàn bộ quy trình từ đầu đến cuối gồm cài Certbot, lấy chứng chỉ, cấu hình HTTPS tự động, thiết lập gia hạn và xử lý các lỗi thường gặp. Làm theo đúng thứ tự, website của bạn sẽ có HTTPS hoạt động trong khoảng 10 phút.

Let’s Encrypt và SSL miễn phí là gì?
Let’s Encrypt là một tổ chức chứng thực số (Certificate Authority) phi lợi nhuận, cung cấp chứng chỉ SSL/TLS miễn phí, tự động và được công nhận rộng rãi. Mỗi chứng chỉ có thời hạn 90 ngày, nhưng quá trình gia hạn có thể tự động hóa hoàn toàn, giúp website của bạn luôn được bảo mật mà không cần can thiệp thủ công.
Yêu Cầu Trước Khi Bắt Đầu
Trước khi chạy bất kỳ lệnh nào, hãy đảm bảo đủ điều kiện để tránh mất thời gian debug sau.
- Hệ điều hành: Ubuntu 20.04 / 22.04 hoặc Debian 10/11 (bài này dùng Ubuntu 22.04)
- Nginx đã được cài và đang chạy
- Tên miền đã trỏ A record về đúng IP của server (DNS đã propagate)
- Cổng 80 và 443 đang mở trên firewall
- Quyền root hoặc user có sudo
Kiểm tra Nginx đang chạy:
sudo systemctl status nginx
Kiểm tra domain đã trỏ đúng IP chưa:
dig +short yourdomain.com
Kết quả trả về phải là IP của server bạn đang dùng. Nếu DNS chưa propagate, chờ thêm trước khi tiếp tục vì Certbot sẽ không cấp chứng chỉ nếu domain không trỏ đúng.
Bước 1: Cài Đặt Certbot
Certbot được phát triển bởi Electronic Frontier Foundation (EFF) và là công cụ chính thức để tương tác với Let’s Encrypt. Cài đặt trên Ubuntu 22.04 qua snap là cách được khuyến nghị hiện tại vì luôn nhận phiên bản mới nhất.
Cài snapd và Certbot:
sudo apt update
sudo apt install snapd -y
sudo snap install --classic certbot
Tạo symlink để dùng lệnh certbot trực tiếp:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Kiểm tra Certbot đã cài thành công:
certbot --version
Kết quả trả về dạng certbot 2.x.x là thành công.
Bước 2: Mở Cổng Firewall
Certbot cần cổng 80 để xác minh domain và cổng 443 để HTTPS hoạt động. Nếu bạn đang dùng UFW, mở hai cổng này trước khi chạy Certbot.
sudo ufw allow 'Nginx Full'
sudo ufw status
Nginx Full bao gồm cả cổng 80 (HTTP) và 443 (HTTPS). Nếu trước đó bạn chỉ mở Nginx HTTP, xóa rule cũ đi:
sudo ufw delete allow 'Nginx HTTP'
Bước 3: Cấu Hình Server Block Nginx
Certbot cần đọc được tên miền trong cấu hình Nginx để tự động cấu hình HTTPS. Đảm bảo server block của bạn có đúng server_name.
Kiểm tra hoặc tạo file cấu hình cho domain:
sudo nano /etc/nginx/sites-available/yourdomain.com
Nội dung tối thiểu cần có:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/yourdomain.com/html;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
}
Kích hoạt site và kiểm tra cấu hình:
sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Lệnh nginx -t phải trả về syntax is ok và test is successful mới tiếp tục bước tiếp theo.
Bước 4: Lấy Chứng Chỉ SSL và Cấu Hình HTTPS Tự Động
Đây là bước quan trọng nhất. Certbot plugin Nginx sẽ tự lấy chứng chỉ từ Let’s Encrypt và chỉnh sửa cấu hình Nginx để bật HTTPS.
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Certbot sẽ hỏi một số thông tin:
Enter email address (used for urgent renewal and security notices):
→ Nhập email của bạn để nhận thông báo khi chứng chỉ sắp hết hạn
(A)gree/(C)ancel:
→ Nhập A để đồng ý điều khoản dịch vụ của Let’s Encrypt
(Y)es/(N)o:
→ Chọn Y hoặc N tùy bạn có muốn nhận email từ EFF không (không ảnh hưởng đến chứng chỉ)
Nếu thành công, Certbot tự động:
- Lấy chứng chỉ SSL từ Let’s Encrypt
- Chỉnh sửa file cấu hình Nginx để bật HTTPS trên cổng 443
- Thêm redirect tự động từ HTTP sang HTTPS
- Lưu chứng chỉ vào /etc/letsencrypt/live/yourdomain.com/
Kết quả thành công trông như sau:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/yourdomain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/yourdomain.com/privkey.pem
This certificate expires on 2026-07-01.
Bước 5: Xác Nhận Cấu Hình Nginx Sau Khi Cài SSL
Sau khi Certbot chạy xong, file cấu hình Nginx được chỉnh sửa tự động. Nên xem lại để hiểu những gì đã thay đổi.
sudo cat /etc/nginx/sites-available/yourdomain.com
File sẽ trông tương tự như sau:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
root /var/www/yourdomain.com/html;
index index.html index.php;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
try_files $uri $uri/ =404;
}
}
Kiểm tra và reload Nginx:
sudo nginx -t && sudo systemctl reload nginx
Bước 6: Kiểm Tra SSL Đã Hoạt Động
Sau khi cài xong, kiểm tra SSL đang hoạt động đúng trước khi kết thúc.
Kiểm tra trên trình duyệt: Truy cập https://yourdomain.com, biểu tượng ổ khóa xuất hiện trên thanh địa chỉ là thành công. Thử truy cập http://yourdomain.com để kiểm tra redirect về HTTPS có hoạt động không.
Kiểm tra bằng curl:
curl -I http://yourdomain.com
Kết quả phải trả về 301 Moved Permanently với header Location: https://yourdomain.com.
Kiểm tra điểm bảo mật với SSL Labs: Vào https://www.ssllabs.com/ssltest/, nhập tên miền và chạy test. Cấu hình Let’s Encrypt với Certbot trên Nginx thường đạt điểm A hoặc A+ ngay từ đầu nhờ file options-ssl-nginx.conf của Certbot đã cấu hình TLS 1.2/1.3 và cipher suite an toàn.
Bước 7: Cấu Hình Tự Động Gia Hạn SSL
Chứng chỉ Let’s Encrypt có hiệu lực 90 ngày. Certbot tự động cài một systemd timer để gia hạn trước khi hết hạn, không cần bạn làm gì.
Kiểm tra timer đã được cài chưa:
sudo systemctl status snap.certbot.renew.timer
Kiểm tra thử quy trình gia hạn có hoạt động không:
sudo certbot renew --dry-run
Lệnh --dry-run giả lập quá trình gia hạn mà không thực sự lấy chứng chỉ mới. Kết quả trả về Congratulations, all simulated renewals succeeded là hoàn tất.
Certbot sẽ tự gia hạn khi chứng chỉ còn dưới 30 ngày, chạy hai lần mỗi ngày vào giờ ngẫu nhiên để phân tán tải cho server Let’s Encrypt.
Xử lý lỗi thường gặp
Dưới đây là các lỗi phổ biến nhất khi cài SSL với Certbot và cách xử lý nhanh.

Lỗi: Could not bind to IPv4/IPv6
Certbot cần dùng cổng 80 để xác minh domain nhưng Nginx đang chiếm cổng này. Giải pháp là dùng plugin Nginx thay vì standalone:
sudo certbot --nginx -d yourdomain.com
Plugin Nginx không cần tắt Nginx, xử lý trực tiếp qua cấu hình.
Lỗi: DNS problem: NXDOMAIN looking up A for yourdomain.com
Domain chưa trỏ về IP của server hoặc DNS chưa propagate. Kiểm tra lại A record và chờ thêm 15-30 phút rồi chạy lại.
Lỗi: too many certificates already issued for yourdomain.com
Let’s Encrypt giới hạn 5 chứng chỉ cho cùng một domain trong 7 ngày. Nếu bạn đã chạy lệnh certbot nhiều lần do lỗi, dùng flag –staging để test trước:
sudo certbot --nginx --staging -d yourdomain.com
Lỗi Mixed Content sau khi cài SSL
Website đã có HTTPS nhưng một số tài nguyên (ảnh, CSS, JS) vẫn load qua HTTP. Nếu dùng WordPress, cài plugin Really Simple SSL để tự động fix, hoặc thêm vào cấu hình Nginx:
add_header Content-Security-Policy "upgrade-insecure-requests";
Chứng chỉ không tự gia hạn được
Kiểm tra log gia hạn:
sudo journalctl -u snap.certbot.renew.service
Nguyên nhân thường gặp là cổng 80 bị chặn bởi firewall vào thời điểm gia hạn, hoặc cấu hình Nginx có lỗi. Sửa lỗi và chạy certbot renew --dry-run lại để xác nhận.
Tối ưu thêm sau khi cài ssl
Sau khi SSL hoạt động, có thể thêm một số cấu hình để tăng điểm bảo mật.
Bật HSTS (HTTP Strict Transport Security)
HSTS yêu cầu trình duyệt luôn dùng HTTPS khi truy cập domain, ngăn tấn công SSL stripping. Thêm vào server block HTTPS trong Nginx:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Bật OCSP Stapling
Giúp trình duyệt xác minh tính hợp lệ của chứng chỉ nhanh hơn mà không cần kết nối đến CA:
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
Sau khi thêm, reload Nginx và kiểm tra lại điểm trên SSL Labs để xác nhận đã đạt A+.
Vậy là trên đây Cloud360 đã hướng xong cách cài SSL Let’s Encrypt miễn phí với Certbot trên Nginx. Chúc bạn thành công!


























Bình luận: 35









