Giao thức ACME (Automated Certificate Management Environment) từ lâu đã rất thịnh hành cho việc tự động cấp phát và gia hạn chứng chỉ SSL/TLS, giúp quản lý bảo mật web trở nên dễ dàng. Let’s Encrypt, cái tên quen thuộc với nhiều người, chính là ví dụ điển hình sử dụng ACME để cung cấp chứng chỉ miễn phí.
Điều đặc biệt là Nginx giờ đã hỗ trợ ACME ngay trong core, không cần phải cài thêm công cụ bên thứ ba như Certbot hay script nào khác như trước nữa. Điều này có nghĩa là bạn có thể tự động hóa chứng chỉ SSL/TLS ngay trong cấu hình Nginx, tiết kiệm thời gian và giảm bớt rắc rối. DevOps VietNam sẽ giải thích rõ ACME là gì, tại sao Nginx tích hợp nó là một bước tiến lớn, và cách bạn có thể bắt đầu dùng ngay, kèm ví dụ cụ thể.
ACME Là Gì? Tại Sao Nó Quan Trọng?
ACME là giao thức được thiết kế để tự động hóa việc lấy, xác minh, cài đặt và gia hạn chứng chỉ SSL/TLS. Trước đây, để có một chứng chỉ SSL, bạn phải tự tay làm mọi thứ: tạo CSR, gửi cho CA, tải chứng chỉ về, cài vào server, rồi còn canh gia hạn. Cứ mỗi 90 ngày (hoặc lâu hơn, tùy CA) lại lặp lại, mệt mỏi và dễ sai. ACME, được phát triển bởi Internet Security Research Group (ISRG) cho Let’s Encrypt từ năm 2015, đã thay đổi cuộc chơi. Nó cho phép server tự giao tiếp với nhà cung cấp chứng chỉ (CA) để làm mọi thứ tự động, từ cấp phát đến gia hạn.
Với Nginx, trước đây bạn phải dựa vào công cụ như Certbot hoặc acme.sh
để làm việc này. Giờ đây, với hỗ trợ ACME tích hợp sẵn (từ bản preview ngày 12/08/2025), bạn có thể cấu hình mọi thứ ngay trong file config của Nginx. Điều này không chỉ tiện hơn mà còn giảm rủi ro lỗi, tăng tính bảo mật (ít phụ thuộc bên thứ ba), và hoạt động mượt mà trên nhiều nền tảng.
Lợi ích chính:
- Tự động hóa: Cấp và gia hạn chứng chỉ mà không cần can thiệp tay.
- Ít lỗi hơn: Không phải lo gõ sai lệnh hoặc quên gia hạn.
- Bảo mật cao: Giảm phụ thuộc vào script bên ngoài, thu hẹp bề mặt tấn công.
- Tiết kiệm thời gian: Cấu hình đơn giản, tích hợp thẳng vào Nginx.
Hỗ Trợ ACME Trên Nginx: Có Gì Mới?
Nginx mới giới thiệu module ngx_http_acme_module
, được viết bằng Rust, hỗ trợ ACMEv2 (phiên bản nâng cấp của ACME với nhiều tính năng như wildcard certificates). Module này có sẵn cho cả Nginx Open Source và Nginx Plus (phiên bản thương mại). Hiện tại, nó hỗ trợ xác minh qua HTTP-01 challenge (đặt file xác minh trên server), và tương lai sẽ hỗ trợ thêm TLS-ALPN và DNS-01.
Điều tuyệt vời là bạn có thể dùng các directive (chỉ thị) trong file cấu hình Nginx để làm mọi thứ: từ liên kết với CA (như Let’s Encrypt), lưu chứng chỉ, đến tự động gia hạn. Không cần script ngoài, không cần chạy cron job riêng, mọi thứ gọn gàng trong Nginx.
Tại sao xịn?
- Tích hợp sâu: Không cần cài thêm Certbot hay
acme.sh
. - Không cần restart server: Chứng chỉ gia hạn tự động, không gián đoạn dịch vụ.
- Dễ cấu hình: Chỉ vài dòng trong file
nginx.conf
. - Phù hợp DevOps: Lý tưởng cho pipeline tự động hóa và môi trường container.
Cấu Hình ACME trong Nginx
Chú ý: yêu cầu module ngx_http_acme_module
.
Dưới đây là ví dụ cấu hình để lấy và gia hạn chứng chỉ cho domain staging.devops.vn
với Let’s Encrypt. File cấu hình nằm ở /etc/nginx/nginx.conf
(hoặc /usr/local/etc/nginx/nginx.conf
trên FreeBSD).
# Cần resolver để liên kết với ACME server
resolver 127.0.0.1:53;
# Định nghĩa ACME issuer
acme_issuer letsencrypt {
uri https://acme-v02.api.letsencrypt.org/directory;
contact support@devops.vn; # Email liên hệ
state_path /var/cache/nginx/acme-letsencrypt; # Nơi lưu dữ liệu module
accept_terms_of_service; # Chấp nhận điều khoản
}
# Vùng bộ nhớ chia sẻ cho chứng chỉ và key
acme_shared_zone zone=ngx_acme_shared:1M;
# Server block cho HTTPS
server {
listen 443 ssl;
server_name staging.devops.vn;
# Sử dụng ACME để tự động cấp/gia hạn chứng chỉ
acme_certificate letsencrypt;
ssl_certificate $acme_certificate;
ssl_certificate_key $acme_certificate_key;
ssl_certificate_cache max=2; # Cache chứng chỉ để tối ưu
# Cấu hình web cơ bản
root /var/www/html;
index index.html;
}
# Server block cho HTTP (cần để xử lý HTTP-01 challenge)
server {
listen 80;
server_name staging.devops.vn;
location /.well-known/acme-challenge/ {
# Phục vụ file xác minh ACME
root /var/www/html;
}
location / {
return 404; # Trả về 404 cho các request không phải challenge
}
}
Giải thích:
acme_issuer
: Định nghĩa CA (ở đây là Let’s Encrypt) và thông tin liên hệ.acme_shared_zone
: Vùng bộ nhớ để lưu chứng chỉ và key, mặc định 256K, có thể tăng nếu cần.acme_certificate
: Chỉ định domain cần cấp chứng chỉ.ssl_certificate
vàssl_certificate_key
: Sử dụng biến của module để áp dụng chứng chỉ.- Server block port 80: Cần để xử lý HTTP-01 challenge (Let’s Encrypt sẽ kiểm tra domain qua đây).
Kiểm tra cấu hình:
nginx -t
nginx -s reload
openssl s_client -connect staging.devops.vn:443
Xem output để xác nhận chứng chỉ từ Let’s Encrypt, với ngày hết hạn hợp lệ.
Gia Hạn Tự Động
Module ACME của Nginx tự động gia hạn chứng chỉ khi gần hết hạn (thường 90 ngày với Let’s Encrypt). Bạn không cần cron job hay script ngoài. Dữ liệu chứng chỉ được lưu ở state_path
(/var/cache/nginx/acme-letsencrypt
trong ví dụ), nên kể cả khi restart Nginx, thông tin vẫn được giữ.
Mẹo Dùng ACME trên Nginx
- Kiểm Tra Port 80: HTTP-01 challenge cần port 80 mở. Đảm bảo firewall không chặn.
- Debug Nếu Có Lỗi: Nếu chứng chỉ không cấp được, kiểm tra log Nginx (
/var/log/nginx/error.log
) hoặc dùng công cụ như Let’s Debug. - Tùy Chỉnh CA: Ngoài Let’s Encrypt, bạn có thể dùng CA khác hỗ trợ ACME như Sectigo hay SSL.com, chỉ cần đổi
uri
trongacme_issuer
. - Tăng Shared Zone: Nếu quản lý nhiều domain, tăng kích thước
acme_shared_zone
(ví dụ:zone=ngx_acme_shared:10M
). - Cập Nhật Nginx: Module ACME hiện ở giai đoạn preview (tính đến 12/08/2025). Check cập nhật từ Nginx để có thêm tính năng như DNS-01 challenge.
Lưu Ý
- Hạn Chế Hiện Tại: Phiên bản preview chỉ hỗ trợ HTTP-01 challenge. Nếu bạn cần DNS-01 (cho wildcard certificates), phải chờ bản cập nhật hoặc vẫn dùng Certbot tạm thời.
- Quyền Truy Cập: Đảm bảo Nginx có quyền ghi vào
state_path
(như/var/cache/nginx
). - Backup: Dù tự động, bạn nên backup thư mục
state_path
để tránh mất key nếu server crash. - Tương Thích: Module này cần Nginx phiên bản mới (1.29.0+ cho Nginx Plus). Check phiên bản bằng
nginx -v
.
Kết Luận
Việc Nginx tích hợp ACME là một bước tiến lớn, giúp bạn tự động hóa chứng chỉ SSL/TLS mà không cần lằng nhằng với Certbot hay script ngoài. Chỉ vài dòng cấu hình, bạn đã có một server HTTPS an toàn, tự gia hạn, không lo gián đoạn.