Cài SSL Tự Động Vì ACME Đã Có Sẵn Trên Nginx

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ó:

  1. 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 trong target/release/.

  2. Cho người dùng Nginx Plus:

    • Tải package nginx-plus-module-acme từ kho F5. Cần file nginx-repo.crtnginx-repo.key từ MyF5 Customer Portal.
    • Cài đặt, ví dụ trên Ubuntu:
    sudo apt update
    sudo apt install nginx-plus-module-acme
  3. 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;
  4. 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_certificatessl_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

  1. Kiểm tra cấu hình:

    nginx -t
  2. Reload Nginx:

    nginx -s reload
  3. 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ệ.

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

  1. Kiểm Tra Port 80: HTTP-01 challenge cần port 80 mở. Đảm bảo firewall không chặn.
  2. 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.
  3. 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 trong acme_issuer.
  4. 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).
  5. 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.

Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận