DeployEasy
Menu
NginxCơ bản

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.

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

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:

  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.

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