DEV Community

Reverse Proxy Setup + SSL Self-Sign (Root CA + Wildcard)

Reverse Proxy Setup + SSL Self-Sign (Root CA + Wildcard)

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.key adalah 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

Buat file wildcard.cnf dengan 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 v3.ext dengan 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:

Name Type Value
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.key hilang, 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.

Comments

No comments yet. Start the discussion.