Giao thức ACME (Automated Certificate Management Environment) từ lâu đã rấ 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ể. Giọng văn sẽ tự nhiên, dễ hiểu, đúng kiểu chia sẻ mẹo hay giữa bạn bè.
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ách Sử Dụng ACME trên Nginx
Dưới đây là hướng dẫn từng bước để thiết lập chứng chỉ SSL/TLS tự động với Let’s Encrypt trên Nginx, dùng module ACME mới. Tui sẽ đưa ra ví dụ cụ thể, kèm code cấu hình, để bạn có thể thử ngay.
Bước 1: Cài Đặt Module ACME
Module ngx_http_acme_module
không đi kèm mặc định trong Nginx, mà là một dynamic module. Bạn cần cài nó:
-
Cho người dùng Nginx Open Source:
- Tải pre-built package từ kho Nginx hoặc build từ mã nguồn tại GitHub nginx-acme.
- Yêu cầu: Nginx source, Rust toolchain (1.81.0+), OpenSSL 1.1.1+, và các công cụ build như
make
,gcc
.
# Ví dụ build module cd nginx-acme export NGINX_BUILD_DIR=$(realpath ../nginx/objs) cargo build --release
Kết quả sẽ tạo file
libnginx_acme.so
trongtarget/release/
. -
Cho người dùng Nginx Plus:
- Tải package
nginx-plus-module-acme
từ kho F5. Cần filenginx-repo.crt
vànginx-repo.key
từ MyF5 Customer Portal. - Cài đặt, ví dụ trên Ubuntu:
sudo apt update sudo apt install nginx-plus-module-acme
- Tải package
-
Kích hoạt module: Thêm dòng sau vào file
/etc/nginx/nginx.conf
:load_module modules/ngx_http_acme_module.so;
-
Kiểm tra cấu hình:
nginx -t
Nếu không có lỗi, reload Nginx:
nginx -s reload
.
Bước 2: Cấu Hình ACME trong Nginx
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).
Bước 3: Kiểm Tra và Kích Hoạt
-
Kiểm tra cấu hình:
nginx -t
-
Reload Nginx:
nginx -s reload
-
Kiểm tra chứng chỉ:
- Truy cập
https://staging.devops.vn
trên trình duyệt, bạn sẽ thấy khóa bảo mật. - Hoặc kiểm tra từ terminal:
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ệ.
- Truy cập
Bước 4: 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.