Quay lại
DevOps
5 phút đọc23 tháng 3, 20265

Cài SSL miễn phí cho Nginx với Let's Encrypt trên Ubuntu

Hướng dẫn từng bước cài certificate SSL miễn phí bằng Certbot cho Nginx trên Ubuntu, kèm auto-renewal và các mẹo hardening HTTPS từ thực tế.

N

Nguyen Nhat Long

@longnn

# Cài SSL miễn phí cho Nginx với Let's Encrypt trên Ubuntu

Năm 2025 rồi mà website vẫn chạy HTTP thì coi như tự bắn vào chân mình. Google đánh dấu "Not Secure", user mất niềm tin, SEO tụt hạng — chưa kể dữ liệu truyền đi không mã hóa thì ai cũng đọc được. May mắn là từ khi có Let's Encrypt, chuyện cài SSL không còn tốn một xu nào và chỉ mất khoảng 10 phút.

Mình đã cài Let's Encrypt cho hàng chục server production trong mấy năm qua, từ side project cá nhân đến hệ thống phục vụ hàng triệu request/ngày. Bài này mình chia sẻ lại quy trình step-by-step, kèm những lỗi mình từng gặp để bạn không phải đạp lại vết xe đổ.

Let's Encrypt và Certbot là gì?

Let's Encrypt là một Certificate Authority (CA) miễn phí, tự động, và open. Thay vì phải mua certificate từ các nhà cung cấp truyền thống với giá vài chục đến vài trăm đô mỗi năm, bạn có thể lấy certificate hoàn toàn free.

Certbot là tool chính thức của Let's Encrypt — một CLI client giúp tự động hóa toàn bộ quá trình: xác minh domain, lấy certificate, cấu hình web server, và setup auto-renewal. Nó có plugin riêng cho cả Nginx và Apache, nên gần như bạn chỉ cần chạy một lệnh là xong.

Điều mình thấy hay là certificate của Let's Encrypt chỉ valid 90 ngày — nghe có vẻ bất tiện, nhưng thực ra đây là design có chủ đích. Nó buộc bạn phải setup auto-renewal, và việc rotate certificate thường xuyên cũng an toàn hơn.

Chuẩn bị trước khi bắt đầu

Bạn cần sẵn mấy thứ này:

  • Ubuntu server (22.04, 24.04, hoặc 25.04 đều được) với user có quyền sudo.
  • Nginx đã cài và đang chạy.
  • Domain đã trỏ DNS A record về IP server. Cả example.comwww.example.com nếu bạn muốn cover cả hai.
  • Port 80 và 443 phải mở trên firewall.

Theo kinh nghiệm của mình, 90% trường hợp cài Certbot fail là do DNS chưa propagate hoặc firewall chặn port 80. Nên trước khi làm gì, hãy chắc chắn dig example.com trả về đúng IP server của bạn.

Cài Certbot

Cách cài nhanh nhất trên Ubuntu hiện tại là dùng snap:

Terminal
1sudo snap install --classic certbot
2sudo ln -s /snap/bin/certbot /usr/bin/certbot

Đừng cài Certbot qua apt nữa — version trong repo Ubuntu thường outdated khá nhiều. Snap đảm bảo bạn luôn có bản mới nhất.

Kiểm tra cấu hình Nginx

Certbot cần biết domain nào đang được serve bởi Nginx. Mở file config của bạn (thường nằm ở /etc/nginx/sites-available/):

Nginx
1server {
2 listen 80;
3 server_name example.com www.example.com;
4 root /var/www/example.com/html;
5}

Đảm bảo server_name đã khai báo đúng domain. Sau đó verify config:

Terminal
1sudo nginx -t
2sudo systemctl reload nginx

Mở firewall cho HTTPS

Nếu bạn dùng UFW:

Terminal
1sudo ufw allow 'Nginx Full'
2sudo ufw delete allow 'Nginx HTTP'
3sudo ufw status

Nginx Full mở cả port 80 và 443. Bạn cần giữ port 80 vì Certbot dùng HTTP-01 challenge để xác minh domain.

Lấy SSL Certificate

Đây là bước chính — và nó đơn giản đến bất ngờ:

Terminal
1sudo certbot --nginx -d example.com -d www.example.com

Certbot sẽ hỏi email (để thông báo khi certificate sắp hết hạn), đồng ý terms of service, và sau đó tự động:

  1. Tạo challenge file để Let's Encrypt verify bạn sở hữu domain
  2. Lấy certificate về
  3. Sửa config Nginx để dùng SSL
  4. Setup redirect HTTP → HTTPS

Sau khi chạy xong, mở browser truy cập https://example.com — bạn sẽ thấy ổ khóa xanh. Done!

Setup Auto-Renewal

Certificate chỉ valid 90 ngày, nhưng Certbot đã tự thêm systemd timer để renew. Kiểm tra:

Terminal
1sudo systemctl status snap.certbot.renew.timer

Test thử dry-run:

Terminal
1sudo certbot renew --dry-run

Nếu không có lỗi gì thì bạn yên tâm — certificate sẽ tự renew trước khi hết hạn. Mình từng quên check cái này ở một server, kết quả là 3 tháng sau website bị báo certificate expired vào lúc 2 giờ sáng. Không vui chút nào.

Hardening HTTPS cho production

Cài xong SSL mới chỉ là bước đầu. Để đạt điểm A+ trên [SSL Labs](https://www.ssllabs.com/ssltest/), bạn nên thêm mấy config này:

HSTS (HTTP Strict Transport Security)

Nginx
1add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

Header này bảo browser: "Từ giờ chỉ kết nối HTTPS, đừng bao giờ thử HTTP nữa." max-age=63072000 tương đương 2 năm.

Cipher suites hiện đại

Nginx
1ssl_protocols TLSv1.2 TLSv1.3;
2ssl_prefer_server_ciphers on;
3ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';

Tắt TLSv1.0 và TLSv1.1 đi — chúng đã deprecated và không an toàn.

OCSP Stapling

Nginx
1ssl_stapling on;
2ssl_stapling_verify on;
3resolver 8.8.8.8 8.8.4.4 valid=300s;

OCSP Stapling giúp giảm latency khi client verify certificate. Nhỏ nhưng có võ.

Những lỗi hay gặp

Challenge failed: Certbot không verify được domain → kiểm tra DNS A record và đảm bảo port 80 không bị chặn. Dùng curl -I http://example.com từ máy khác để test.

Rate limit: Let's Encrypt giới hạn 50 certificate/domain/tuần. Khi test, dùng flag --staging để tránh bị limit.

Nginx config conflict: Nếu bạn có nhiều server block cùng listen port 80, Certbot có thể confused. Đảm bảo mỗi domain chỉ có một server block active.

Renewal fail im lặng: Setup monitoring cho certificate expiry. Mình dùng UptimeRobot hoặc đơn giản là cron job check certbot certificates rồi gửi alert qua Slack.

Những điều đáng nhớ

  • Certbot + Snap là cách cài chuẩn nhất trên Ubuntu hiện tại.
  • DNS và firewall là nguyên nhân số 1 gây fail — check kỹ trước khi chạy Certbot.
  • Auto-renewal phải được test bằng --dry-run, đừng assume nó hoạt động.
  • HSTS + modern ciphers giúp bạn đạt A+ trên SSL Labs, không chỉ "có SSL" cho có.
  • Certificate 90 ngày là by design — embrace automation, đừng chống lại nó.

SSL ngày nay không còn là thứ "nice to have" nữa — nó là baseline. Với Let's Encrypt và Certbot, bạn không có lý do gì để không cài. 10 phút setup, server an toàn hơn, user tin tưởng hơn, Google happy hơn. Win-win cả thôi. Nếu bạn đang quản lý server nào chưa có SSL, hãy dành 10 phút tối nay làm luôn đi — future you sẽ cảm ơn present you đấy.

NN

Nguyen Nhat Long

@longnn

Thấy hay? Chia sẻ cho bạn bè!

Bài viết liên quan

Có thể bạn cũng thích

Xem tất cả