Optimasi Konfigurasi SSL #
Setelah sertifikat terpasang, konfigurasi SSL default Nginx sudah cukup untuk membuat HTTPS bekerja. Tapi “bekerja” belum tentu berarti “aman dan efisien”. Ada sejumlah parameter yang perlu dikonfigurasi untuk memastikan sertifikatmu tidak mudah diserang dan koneksi HTTPS tidak menambahkan latency yang tidak perlu.
Protocol: TLS 1.2 dan 1.3 Saja #
Nonaktifkan semua versi lama yang sudah diketahui memiliki kelemahan:
# Di level http atau server
ssl_protocols TLSv1.2 TLSv1.3;
# Jangan gunakan:
# SSLv2, SSLv3 — sudah lama tidak aman
# TLSv1.0, TLSv1.1 — resmi deprecated, browser sudah drop support
TLS 1.3 lebih cepat (1-RTT handshake vs 2-RTT di 1.2) dan lebih aman. TLS 1.2 masih perlu dipertahankan untuk kompatibilitas dengan klien lama.
Cipher Suites #
Cipher suite menentukan algoritma enkripsi yang digunakan. Rekomendasi Mozilla untuk konfigurasi “intermediate” (keseimbangan keamanan dan kompatibilitas):
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;
# Biarkan klien memilih cipher yang diinginkan (bukan server)
# Ini lebih aman di TLS 1.3 karena klien tahu hardware mereka sendiri
ssl_prefer_server_ciphers off;
Daripada menghafal string cipher yang panjang ini, gunakan Mozilla SSL Configuration Generator yang secara otomatis menghasilkan konfigurasi terbaru yang direkomendasikan.
Session Cache dan Session Tickets #
TLS handshake memiliki overhead. Session resumption memungkinkan klien yang sudah pernah konek untuk melanjutkan tanpa full handshake:
# Session cache di shared memory — bisa diakses semua worker process
# 1m ≈ 4000 session
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# Session tickets — alternatif session cache, state disimpan di klien
# Dienkripsi dengan ticket key di server
ssl_session_tickets off;
# Sebaiknya off kecuali kamu mengelola ticket key rotation sendiri
# Ticket keys yang tidak dirotasi berpotensi melemahkan forward secrecy
Dengan ssl_session_cache shared:SSL:10m, semua worker process Nginx berbagi cache yang sama — request berikutnya dari klien yang sama bisa ditangani worker manapun dan tetap bisa resume session.
OCSP Stapling #
Saat browser menerima sertifikat, ia perlu memverifikasi apakah sertifikat tersebut belum dicabut (revoked) oleh CA. Tanpa stapling, browser harus menghubungi CA server secara terpisah — menambah latency.
Dengan OCSP Stapling, Nginx secara proaktif mendapatkan status sertifikat dari CA dan menyertakannya (“staple”) langsung dalam TLS handshake. Browser tidak perlu membuat koneksi terpisah ke CA.
ssl_stapling on;
ssl_stapling_verify on;
# Resolver untuk query OCSP (gunakan DNS resolver yang kamu percaya)
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# File yang berisi certificate chain (needed for stapling)
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
DH Parameters #
Untuk cipher yang menggunakan Diffie-Hellman key exchange (DHE), kamu perlu file parameter DH yang kuat:
# Generate DH parameters (butuh waktu beberapa menit)
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
Catatan: cipher ECDHE (Elliptic Curve) yang lebih modern tidak membutuhkan DH parameters terpisah. Jika konfigurasi cipher kamu hanya menggunakan ECDHE, baris ini tidak terlalu penting.
HSTS: Paksa Browser Gunakan HTTPS #
HTTP Strict Transport Security memberi tahu browser untuk selalu menggunakan HTTPS ke domain ini, bahkan jika pengguna mengetik http://:
server {
listen 443 ssl;
server_name example.com;
# max-age dalam detik (31536000 = 1 tahun)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Tambahkan 'preload' jika ingin masuk HSTS preload list browser
# (hati-hati: ini hampir tidak bisa di-undo!)
# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
}
Setelah browser menerima header ini, ia tidak akan pernah membuat koneksi HTTP ke domain ini lagi selama masa max-age — bahkan jika pengguna secara eksplisit mengetik http://.
Jangan aktifkan HSTS sebelum yakin bahwa semua subdomain bisa melayani HTTPS. includeSubDomains berarti semua subdomain juga kena aturan ini. Jika ada subdomain yang tidak punya HTTPS, ia tidak akan bisa diakses.Konfigurasi Lengkap yang Direkomendasikan #
Menggabungkan semua optimasi di atas dalam satu konfigurasi yang bisa digunakan sebagai template:
# /etc/nginx/snippets/ssl-params.conf
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;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# /etc/nginx/conf.d/example.com.conf
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl-params.conf;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
root /var/www/html;
location / {
try_files $uri $uri/ =404;
}
}
Mengetes Konfigurasi SSL #
# Test lokal dengan openssl
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_3
# Lihat versi TLS dan cipher yang digunakan
echo | openssl s_client -connect example.com:443 2>&1 | grep -E "Protocol|Cipher"
Untuk test yang lebih komprehensif, gunakan SSL Labs Server Test — ia memberikan rating A hingga F dan mendeteksi semua kelemahan konfigurasi SSL secara gratis.
Ringkasan #
- Aktifkan hanya TLS 1.2 dan TLS 1.3 — nonaktifkan semua versi lama.
- Gunakan Mozilla SSL Configuration Generator untuk mendapatkan konfigurasi cipher yang direkomendasikan dan selalu up-to-date.
ssl_session_cache shared:SSL:10mmemungkinkan session resumption antar semua worker process.- OCSP Stapling menghilangkan kebutuhan browser untuk query CA secara terpisah — kurangi latency.
- HSTS memaksa browser selalu menggunakan HTTPS — aktifkan setelah yakin semua subdomain siap.
- Test konfigurasi dengan SSL Labs untuk mendapatkan rating dan deteksi kelemahan yang komprehensif.