Pada postingan ini saya akan membahas bagaimana membangun Reverse Proxy Nginx dengan SSL Internal (Self-Signed PKI) tanpa menggunakan domain publik maupun IP publik.
Studi kasus ini cocok untuk:
- Rumah Sakit
- Kantor
- Sekolah
- Lab
- Infrastruktur Internal
- Homelab
Target akhirnya adalah semua aplikasi internal dapat diakses menggunakan HTTPS tanpa muncul peringatan ("Not Secure") di browser.
Topologi
Client
│
▼
Technitium DNS (10.10.10.75)
│
┌───────────────┴───────────────┐
│ │
app.domainku.internal portal.domainku.internal
│ │
└───────────────┬───────────────┘
▼
Nginx Reverse Proxy (10.10.10.79)
HTTPS (Wildcard SSL)
│
┌───────────┴───────────┐
▼ ▼
App Server Portal Server
10.10.10.1 10.10.10.2
Target:
Browser Secure -> tanpa warning.
Kenapa Tidak Menggunakan Let's Encrypt?
Karena pada studi kasus ini:
- Tidak memiliki IP Publik
- Tidak memiliki Domain Publik
- Semua server berada di jaringan internal
Sehingga solusi terbaik adalah membuat Certificate Authority (CA) sendiri.
Konsep PKI Sederhana
Banyak orang langsung membuat sertifikat seperti ini:
Server Certificate
│
Signed by
│
Server itu sendiri
Metode tersebut disebut Self-Signed Certificate. Masalahnya browser tidak akan mempercayainya. Metode yang akan kita gunakan adalah:
Root CA
│
└───────────────┐
▼
Wildcard Certificate
│
▼
Nginx
Browser hanya perlu percaya kepada Root CA, kemudian seluruh sertifikat yang diterbitkan Root CA tersebut akan dianggap valid.
Tahap 1 — Membuat Root CA
Apa itu Root CA?
Root CA adalah induk kepercayaan.
Browser tidak perlu percaya langsung kepada website.
Browser cukup percaya kepada:
Domainku Internal Root CA
Kemudian seluruh sertifikat yang diterbitkan Root CA tersebut akan dipercaya.
Membuat Folder PKI
sudo mkdir -p /root/pki
cd /root/pki
Membuat Private Key Root CA
openssl genrsa -out ca.key 4096
Hasil:
ca.key
⚠️ PENTING
File
ca.keyadalah aset paling penting.Jangan dibagikan.
Jangan dihapus.
Backup dengan aman.
Membuat Sertifikat Root CA
openssl req \
-x509 \
-new \
-key ca.key \
-sha256 \
-days 3650 \
-out ca.crt
Keterangan:
| Parameter | Penjelasan |
|---|---|
-x509 |
Membuat Certificate Authority |
-days 3650 |
Berlaku selama 10 tahun |
Contoh isian:
Country Name: ID
State: Jawa Barat
Locality: Cirebon
Organization: Domainku Internal
Common Name: Domainku Internal Root CA
Hasil:
ca.crt
Sekarang kita memiliki:
ca.key
ca.crt
Tahap 2 — Membuat Wildcard Certificate
Tujuan kita adalah membuat satu sertifikat untuk seluruh subdomain.
*.domainku.internal
Sehingga dapat digunakan untuk:
app.domainku.internal
portal.domainku.internal
grafana.domainku.internal
git.domainku.internal
monitoring.domainku.internal
Membuat Private Key
openssl genrsa -out wildcard.key 4096
Hasil:
wildcard.key
Membuat File CSR
nano wildcard.cnf
Isi:
[req]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext
[dn]
C=ID
ST=Jawa Barat
L=Cirebon
O=Domainku Internal
CN=*.domainku.internal
[req_ext]
subjectAltName=@alt_names
[alt_names]
DNS.1=*.domainku.internal
DNS.2=domainku.internal
Generate CSR
openssl req \
-new \
-key wildcard.key \
-out wildcard.csr \
-config wildcard.cnf
CSR (Certificate Signing Request) adalah permintaan kepada Root CA untuk menerbitkan sertifikat.
Tahap 3 — Menandatangani Wildcard
Buat file:
nano v3.ext
Isi:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature,keyEncipherment
extendedKeyUsage=serverAuth
subjectAltName=@alt_names
[alt_names]
DNS.1=*.domainku.internal
DNS.2=domainku.internal
Sign menggunakan Root CA:
openssl x509 \
-req \
-in wildcard.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-out wildcard.crt \
-days 1825 \
-sha256 \
-extfile v3.ext
Keterangan:
1825 hari = 5 tahun
Sekarang kita memiliki:
wildcard.crt
wildcard.key
Hubungannya menjadi:
ca.crt
│
▼
menandatangani
│
▼
wildcard.crt
Tahap 4 — Membuat Full Chain
Gabungkan sertifikat:
cat wildcard.crt ca.crt > fullchain.crt
Hasil:
fullchain.crt
Tahap 5 — Install ke Nginx
sudo mkdir -p /etc/nginx/ssl
Copy file:
sudo cp wildcard.key /etc/nginx/ssl/
sudo cp fullchain.crt /etc/nginx/ssl/
Atur permission:
sudo chown root:root /etc/nginx/ssl/*
sudo chmod 600 /etc/nginx/ssl/wildcard.key
sudo chmod 644 /etc/nginx/ssl/fullchain.crt
Tahap 6 — Konfigurasi Reverse Proxy
app.domainku.internal
server {
listen 443 ssl http2;
server_name app.domainku.internal;
ssl_certificate /etc/nginx/ssl/fullchain.crt;
ssl_certificate_key /etc/nginx/ssl/wildcard.key;
location / {
proxy_pass http://10.10.10.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
}
portal.domainku.internal
server {
listen 443 ssl http2;
server_name portal.domainku.internal;
ssl_certificate /etc/nginx/ssl/fullchain.crt;
ssl_certificate_key /etc/nginx/ssl/wildcard.key;
location / {
proxy_pass http://10.10.10.2;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
}
Aktifkan site:
sudo ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/portal /etc/nginx/sites-enabled/
Test konfigurasi:
sudo nginx -t
Reload:
sudo systemctl reload nginx
Tahap 7 — Konfigurasi DNS
Pada Technitium DNS buat record:
app A 10.10.10.79
portal A 10.10.10.79
Sehingga:
app.domainku.internal
→ 10.10.10.79
portal.domainku.internal
→ 10.10.10.79
Tahap 8 — Agar Browser Percaya
Langkah ini hanya dilakukan sekali untuk setiap komputer client.
Windows
- Jalankan:
certlm.msc
- Masuk ke:
Trusted Root Certification Authorities
- Klik:
Import
- Pilih:
ca.crt
Selesai.
Ubuntu / Debian
sudo cp ca.crt /usr/local/share/ca-certificates/domainku-root-ca.crt
sudo update-ca-certificates
Arch Linux
sudo cp ca.crt /etc/ca-certificates/trust-source/anchors/domainku-root-ca.crt
sudo trust extract-compat
Tahap 9 — Verifikasi
Buka:
https://app.domainku.internal
atau
https://portal.domainku.internal
Browser akan melakukan proses berikut:
Website
│
mengirim wildcard certificate
│
▼
Ditandatangani oleh Root CA
│
▼
Browser mempercayai Root CA
│
▼
🔒 Secure
Cara Melihat Masa Berlaku Sertifikat
Wildcard
openssl x509 -in wildcard.crt -noout -dates
Output:
notBefore=...
notAfter=...
Root CA
openssl x509 -in ca.crt -noout -dates
Perpanjangan Sertifikat
Misalnya:
Root CA
2026 → 2036
Wildcard
2026 → 2031
Pada tahun 2031:
- Root CA masih berlaku.
- Yang diperpanjang hanya Wildcard Certificate.
Generate CSR baru, sign kembali menggunakan ca.key, lalu ganti file:
fullchain.crt
wildcard.key
Reload Nginx:
sudo systemctl reload nginx
Client tidak perlu import ulang Root CA selama Root CA yang digunakan masih sama.
Backup yang Wajib
Simpan dengan aman:
/root/pki/ca.key
/root/pki/ca.crt
Backup minimal di:
- Flashdisk offline
- NAS
- Password Manager yang mendukung attachment file
Jika
ca.keyhilang, Anda tidak dapat menerbitkan atau memperpanjang sertifikat menggunakan Root CA tersebut.
Kesimpulan
Dengan metode Root CA + Wildcard Certificate, kita mendapatkan beberapa keuntungan:
- Tidak membutuhkan domain publik.
- Tidak membutuhkan IP publik.
- HTTPS valid tanpa warning setelah Root CA dipercaya.
- Satu sertifikat wildcard dapat digunakan untuk banyak subdomain.
- Renewal cukup dilakukan pada wildcard certificate tanpa perlu mengubah konfigurasi di sisi client selama Root CA masih berlaku.
Metode ini sangat cocok untuk infrastruktur internal seperti rumah sakit, perusahaan, laboratorium, sekolah, maupun homelab yang seluruh layanannya berada di jaringan privat.
Top comments (0)