Skip to main content

Setup SSL Otomatis dengan lua-resty-acme OpenResty

Table of Contents

lua-resty-acme adalah library OpenResty yang digunakan untuk mengelola sertifikat Let’s Encrypt secara otomatis menggunakan protokol ACMEv2. Library ini mendukung sertifikat RSA dan ECC, serta menyediakan dua komponen utama:

  1. resty.acme.autossl - Mengelola siklus hidup sertifikat Let’s Encrypt secara otomatis
  2. restry.acme.client - Implementasi Lua dari protokol ACME v2

Keunggulannya meliputi:

  • Metode Challenge: Mendukung http-01, tls-alpn-01, dan dns-01
  • Sertifikat Ganda: Dapat membuat sertifikat RSA dan ECC secara bersamaan
  • Serfifikat Wildcard: Mendukung pembuatan sertifikat wildcard dengan challenge dns-01
  • Penyimpanan: Mendukung berbagai adapter penyimpanan (file, shm, redis, vault, consul, etcd)
  • DNS Provider: Mendukung Cloudflare, Dynv6, dan Dnspod International

Instalasi
#

Install library lua-resty-acme menggunakan OPM.

opm install fffonion/lua-resty-acme

Gunakan repositori fffonion karena yang paling umum digunakan dan terawat.

Konfigurasi
#

Sebelum mengonfigurasi Nginx, Anda harus membuat kunci akun Let’s Encrypt dan sertifikat cadangan (fallback). Sertifikat cadangan digunakan sementara sertifikat asli sedang diproses atau jika terjadi error.

# Buat direktori jika belum ada
mkdir -p /usr/local/openresty/nginx/ssl

# 1. Buat kunci akun (RSA 4096-bit)
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out /usr/local/openresty/nginx/ssl/account.key

# 2. Buat sertifikat dan kunci fallback (self-signed untuk sementara)
openssl req \
  -x509 \
  -nodes \
  -days 365 \
  -newkey rsa:4096 \
  -keyout /usr/local/openresty/nginx/ssl/default.key \
  -out /usr/local/openresty/nginx/ssl/default.pem \
  -sha256 \
  -addext "extendedKeyUsage = serverAuth" \
  -addext "subjectAltName = DNS:localhost,IP:127.0.0.1,IP:::1" \
  -subj "/C=US/ST=State/L=City/O=Organization/CN=localhost"

Sesuaikan permission pada path /usr/local/openresty/nginx/ssl

chown -R nobody:root /usr/local/openresty/nginx/ssl/

Edit file konfigurasi /usr/local/openresty/nginx/conf/nginx.conf seperti contoh berikut

resolver 8.8.8.8 1.1.1.1 valid=300s ipv6=off;
resolver_timeout 5s;

lua_shared_dict acme_meta 16m;
lua_shared_dict autossl_events 128k;
lua_ssl_trusted_certificate /etc/pki/tls/certs/ca-bundle.crt;
lua_ssl_verify_depth 2;

# Initialisasi ACME Autossl
init_by_lua_block {
    local acme = require("resty.acme.autossl")

    local config = {
        tos_accepted = true,
        staging = false,
        account_email = "[email protected]",
        account_key_path = "/usr/local/openresty/nginx/ssl/account.key",

        -- Daftar domain yang diizinkan
        domain_whitelist = {
            "domainanda.com",
            "www.domainanda.com",
            "api.domainanda.com",
            -- "*.domainanda.com",  -- Wildcard hanya berlaku dengan dns-01
        },
        domain_key_types = { "rsa", "ecc" },
        enabled_challenge_handlers = { "http-01", "tls-alpn-01" },
        storage_adapter = "file",
        storage_config = {
            dir = "/usr/local/openresty/nginx/ssl/storage",
        },
        renew_threshold = 30 * 86400,        -- 30 hari
        renew_check_interval = 4 * 3600,     -- 4 jam
        cache_size = 200,
        blocking = false,
        enabled_delete_not_whitelisted_domain = true,
        failure_cooloff = 300,               -- 5 menit
    }

    acme.init(config)
}

init_worker_by_lua_block {
    require("resty.acme.autossl").init_worker()
}

# Server Utama
server {
    listen 80;
    listen 443 ssl;
    server_name domainanda.com www.domainanda.com api.domainanda.com;

    # SSL Certificate Fallback
    ssl_certificate     /usr/local/openresty/nginx/ssl/default.pem;
    ssl_certificate_key /usr/local/openresty/nginx/ssl/default.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # OCSP Stapling (akan aktif setelah library mendukung)
    # ssl_stapling on;
    # ssl_stapling_verify on;

    # Pemilihan Sertifikat berdasarkan SNI
    ssl_certificate_by_lua_block {
        require("resty.acme.autossl").ssl_certificate()
    }

    # Location: HTTP-01 Challenge
    location /.well-known {
        content_by_lua_block {
            require("resty.acme.autossl").serve_http_challenge()
        }
    }

    # Location: Root
    location / {
        root /var/www/html;
        index index.html;
    }
}

Test konfigurasi dan reload OpenResty

openresty -t
openresty -s reload

Related