Cài HTTPS miễn phí bằng Certbot và Nginx trên Ubuntu
Hướng dẫn cài chứng chỉ HTTPS bằng Certbot cho Nginx, kiểm tra domain, firewall, tự động gia hạn và xử lý lỗi certificate.
Mục lục bài viết
VPS & Hosting cho dự án của bạn
Khám phá các gói máy chủ và lưu trữ phù hợp từ website cá nhân đến ứng dụng production.
HTTPS mã hóa dữ liệu giữa trình duyệt và server. Với website public, HTTPS là cấu hình cơ bản chứ không phải tính năng tùy chọn.
Certbot có thể lấy và cài chứng chỉ TLS cho Nginx, đồng thời hỗ trợ gia hạn tự động.
SSL và TLS khác nhau thế nào?
Tên gọi “SSL certificate” vẫn phổ biến, nhưng giao thức hiện đại thực tế là TLS.
Trong bài này:
SSL certificate
TLS certificate
HTTPS certificate
đều được dùng theo cách gọi thông thường để nói về chứng chỉ HTTPS.
HTTPS nằm ở đâu trong kiến trúc?
Trình duyệt
↓ TLS
Nginx :443
↓ HTTP nội bộ
Ứng dụng :3000
Nginx thường kết thúc TLS rồi proxy request tới ứng dụng nội bộ.
Điều kiện trước khi cài
[ ] Domain đã đăng ký
[ ] A/AAAA/CNAME trỏ đúng
[ ] Nginx đang chạy
[ ] HTTP port 80 truy cập được
[ ] server_name đúng
[ ] Firewall mở 80 và 443
Kiểm tra DNS:
dig deployeasy.vn
dig www.deployeasy.vn
Kiểm tra HTTP:
curl -I http://deployeasy.vn
Không chạy Certbot khi domain còn trỏ sang server khác.
Cấu hình Nginx HTTP trước
server {
listen 80;
listen [::]:80;
server_name deployeasy.vn www.deployeasy.vn;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Kiểm tra:
sudo nginx -t
sudo systemctl reload nginx
Cài Certbot
Cách cài có thể thay đổi theo phiên bản Ubuntu. Hãy ưu tiên hướng dẫn chính thức hiện hành.
Cách phổ biến:
sudo apt update
sudo apt install -y certbot python3-certbot-nginx
Kiểm tra:
certbot --version
Lấy và cài chứng chỉ
sudo certbot --nginx \
-d deployeasy.vn \
-d www.deployeasy.vn
Certbot có thể hỏi:
- Email.
- Điều khoản sử dụng.
- Nhận email hay không.
- Có redirect HTTP sang HTTPS không.
Chỉ yêu cầu hostname đã trỏ đúng tới server này.
Cấu hình sau khi cài
Certbot thường thêm server block HTTPS và đường dẫn chứng chỉ.
Ví dụ rút gọn:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name deployeasy.vn www.deployeasy.vn;
ssl_certificate /etc/letsencrypt/live/deployeasy.vn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/deployeasy.vn/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
}
}
Redirect HTTP:
server {
listen 80;
listen [::]:80;
server_name deployeasy.vn www.deployeasy.vn;
return 301 https://$host$request_uri;
}
Không chỉnh trực tiếp file trong /etc/letsencrypt/live/.
Kiểm tra HTTPS
curl -I https://deployeasy.vn
Dùng OpenSSL:
openssl s_client \
-connect deployeasy.vn:443 \
-servername deployeasy.vn
Xem ngày hết hạn:
echo | openssl s_client \
-servername deployeasy.vn \
-connect deployeasy.vn:443 2>/dev/null |
openssl x509 -noout -issuer -subject -dates
Gia hạn tự động
Certbot thường cài timer hoặc cron.
Kiểm tra:
systemctl list-timers | grep certbot
systemctl status certbot.timer
Test:
sudo certbot renew --dry-run
--dry-run mô phỏng quy trình gia hạn. Nó không có nghĩa chứng chỉ thật vừa được gia hạn.
Xem chứng chỉ đang quản lý
sudo certbot certificates
Thông tin gồm:
- Certificate name.
- Domains.
- Expiry date.
- Certificate path.
- Private key path.
Thêm subdomain
Ví dụ thêm api.deployeasy.vn:
- Tạo DNS.
- Cấu hình Nginx HTTP.
- Kiểm tra truy cập.
- Chạy Certbot.
sudo certbot --nginx \
-d deployeasy.vn \
-d www.deployeasy.vn \
-d api.deployeasy.vn
Certbot có thể hỏi mở rộng hoặc thay thế chứng chỉ.
Wildcard certificate
Wildcard:
*.deployeasy.vn
bao phủ nhiều subdomain một cấp, nhưng không tự bao phủ domain gốc deployeasy.vn.
Wildcard thường cần DNS challenge. Nên dùng plugin DNS chính thức hoặc quy trình tự động an toàn. Không commit API token DNS.
HTTP-01 challenge
Certbot chứng minh quyền kiểm soát domain qua:
http://domain/.well-known/acme-challenge/...
Máy xác minh cần truy cập port 80.
Có thể lỗi nếu:
- DNS sai.
- Port 80 đóng.
- Nginx sai.
- Proxy chặn.
- AAAA sai.
- Domain trỏ nhiều server nhưng challenge không tồn tại ở tất cả.
Lỗi Connection refused
Kiểm tra:
sudo ss -ltnp | grep -E ':80|:443'
sudo ufw status
sudo systemctl status nginx
Lỗi timeout
Có thể do:
- Firewall.
- Security group.
- DNS sai.
- IPv6 sai.
- Nhà cung cấp chặn port.
Lỗi NXDOMAIN
Domain hoặc subdomain chưa có DNS record hợp lệ.
Chứng chỉ cho sai domain
Kiểm tra:
sudo certbot certificates
sudo nginx -T
Có thể nhiều server block trùng server_name.
Rate limit
Đừng lặp Certbot liên tục khi challenge chưa được sửa. Dùng môi trường staging hoặc dry run khi phù hợp.
Cloudflare SSL mode
Nếu Cloudflare proxy bật, có hai chặng:
Client → Cloudflare
Cloudflare → Origin
Origin vẫn nên có chứng chỉ hợp lệ. Khi origin có HTTPS đúng, thường ưu tiên chế độ xác minh đầy đủ như Full (strict).
Flexible có thể gây:
- Kết nối origin không mã hóa.
- Redirect loop.
- Khó chẩn đoán.
Kiểm tra tài liệu Cloudflare hiện hành trước khi đổi mode.
HSTS
Ví dụ:
add_header Strict-Transport-Security "max-age=31536000" always;
Không bật thời gian dài hoặc includeSubDomains khi chưa chắc mọi hostname hoạt động HTTPS. Trình duyệt có thể ghi nhớ chính sách lâu.
HTTPS không bảo vệ điều gì?
HTTPS không tự ngăn:
- SQL injection.
- XSS.
- Secret bị commit.
- Database public.
- VPS không update.
- Password yếu.
- Backup bị lộ.
HTTPS chỉ là một lớp bảo mật.
Monitoring ngày hết hạn
Dù timer tồn tại, gia hạn vẫn có thể thất bại. Cần cảnh báo độc lập trước ngày hết hạn.
echo | openssl s_client \
-servername deployeasy.vn \
-connect deployeasy.vn:443 2>/dev/null |
openssl x509 -noout -enddate
Quy trình chuẩn
1. DNS đúng
2. HTTP hoạt động
3. Nginx test thành công
4. Port 80/443 mở
5. Certbot cấp chứng chỉ
6. HTTPS hoạt động
7. Redirect HTTP → HTTPS
8. renew --dry-run thành công
9. Monitoring ngày hết hạn
Checklist
[ ] A record đúng
[ ] AAAA đúng hoặc không tạo
[ ] server_name đúng
[ ] Port 80 mở
[ ] Port 443 mở
[ ] Certbot từ nguồn chính thức
[ ] Chứng chỉ gồm đủ domain
[ ] Redirect hoạt động
[ ] Dry run thành công
[ ] Timer đang chạy
[ ] Có cảnh báo hết hạn
[ ] HSTS chỉ bật khi hiểu rõ
Câu hỏi thường gặp
HTTPS miễn phí có an toàn không?
Chứng chỉ từ CA uy tín vẫn cung cấp mã hóa và xác minh domain. Giá không quyết định toàn bộ bảo mật hệ thống.
Có cần mở port 80 sau khi có HTTPS?
HTTP-01 renewal và redirect thường vẫn cần port 80, trừ khi dùng phương thức xác minh khác.
Certbot có tự gia hạn không?
Thường có timer hoặc cron, nhưng bạn phải test và theo dõi lỗi.
Một chứng chỉ dùng nhiều domain được không?
Có, nếu tất cả hostname được xác minh thành công.
Kết luận
Cài HTTPS không kết thúc ở thông báo “certificate deployed”. Hãy kiểm tra redirect, gia hạn, domain trong chứng chỉ và cảnh báo hết hạn.
Nguồn tham khảo
Đọc tiếp
Bài viết liên quan
Nginx Reverse Proxy là gì? Cấu hình cho Node.js production
Giải thích Nginx reverse proxy, server block, proxy_pass, header, timeout và cách cấu hình nhiều domain cho ứng dụng Node.js trên VPS.
Đọc bài →Sửa lỗi Nginx 502 Bad Gateway khi deploy Node.js và Docker
Quy trình tìm nguyên nhân Nginx 502 Bad Gateway: upstream chưa chạy, sai port, bind interface, socket, Docker network, timeout và log.
Đọc bài →Cách deploy Next.js lên VPS Ubuntu
Hướng dẫn build và chạy ứng dụng Next.js production bằng PM2, Nginx, domain và HTTPS trên VPS Ubuntu theo từng bước kiểm tra được.
Đọc bài →