DeployEasy
NginxCơ bản

Cài SSL HTTPS miễn phí bằng Certbot và Nginx trên Ubuntu

Hướng dẫn cài SSL HTTPS miễn phí bằng Certbot và Nginx trên Ubuntu, kiểm tra DNS, mở port, tự động gia hạn và sửa lỗi ACME challenge.

· 8 phút đọc· 1.577 từ
Mục lục bài viết

Cài chứng chỉ SSL HTTPS bằng Certbot và Nginx trên Ubuntu

Cài SSL bằng Certbot và Nginx giúp website chuyển từ HTTP sang HTTPS với chứng chỉ miễn phí của Let’s Encrypt. Phần dễ sai không nằm ở câu lệnh Certbot mà ở điều kiện trước đó: DNS phải trỏ đúng VPS, cổng 80 phải truy cập được, server_name phải đúng và không có bản ghi AAAA trỏ nhầm.

Bài viết hướng dẫn kiểm tra từng lớp, cấp chứng chỉ, redirect HTTP sang HTTPS, thử gia hạn bằng certbot renew --dry-run và xử lý các lỗi ACME phổ biến như timeout, NXDOMAIN hoặc challenge đi tới sai server.

Tóm tắt nhanh: Đảm bảo HTTP hoạt động trên đúng hostname trước; chỉ yêu cầu chứng chỉ cho domain đã trỏ về VPS; kiểm tra nginx -t; cấp chứng chỉ; thử HTTPS và chạy certbot renew --dry-run.

Sơ đồ luồng cho cài SSL Certbot Nginx

Demo terminal: kiểm tra trước và sau khi cấp HTTPS

Không chạy lại Certbot liên tục khi domain chưa đúng vì có thể chạm rate limit. Demo xác minh DNS, HTTP, cấu hình Nginx, sau đó mới cấp chứng chỉ và kiểm tra gia hạn mô phỏng.

Terminal demo cho cài SSL Certbot Nginx

dig +short deployeasy.vn A
curl -I http://deployeasy.vn
sudo nginx -t
sudo certbot --nginx -d deployeasy.vn -d www.deployeasy.vn
curl -I https://deployeasy.vn
sudo certbot renew --dry-run

Lưu ý: Output trong ảnh và ví dụ là demo lab đã ẩn thông tin nhạy cảm. Khi chụp terminal thật, hãy che IP quản trị, username nội bộ, token, private key, mật khẩu và chuỗi kết nối database.

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 mở trang hướng dẫn chính thức của Certbot và chọn đúng hệ điều hành cùng web server đang dùng. Với hướng dẫn Ubuntu + Nginx hiện hành, Certbot khuyến nghị cài qua Snap:

sudo apt update
sudo apt install -y snapd
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot

Nếu hệ thống đã có symlink, lệnh cuối có thể báo file tồn tại; hãy kiểm tra bằng command -v certbot thay vì tạo lại mù quáng.

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:

  1. Tạo DNS.
  2. Cấu hình Nginx HTTP.
  3. Kiểm tra truy cập.
  4. 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.

Bài viết liên quan

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