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:
resty.acme.autossl- Mengelola siklus hidup sertifikat Let’s Encrypt secara otomatisrestry.acme.client- Implementasi Lua dari protokol ACME v2
Keunggulannya meliputi:
- Metode Challenge: Mendukung
http-01,tls-alpn-01, dandns-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-acmeGunakan 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