Apa itu HTTPS?
HTTPS (HTTP Secure) adalah versi aman dari HTTP yang menggunakan TLS (Transport Layer Security) untuk mengenkripsi komunikasi antara browser dan server. Tanpa HTTPS, semua data yang dikirim — termasuk password, cookie, dan data pribadi — bisa dibaca oleh siapa saja di jaringan yang sama.
Kenapa HTTPS Wajib?
- Enkripsi — Data tidak bisa dibaca oleh pihak ketiga (ISP, hacker di WiFi publik)
- Integritas — Data tidak bisa dimodifikasi di perjalanan
- Autentikasi — Membuktikan bahwa server adalah yang sebenarnya (bukan impostor)
- SEO — Google memprioritaskan website HTTPS
- Fitur modern — Service Workers, Geolocation, dan WebRTC memerlukan HTTPS
Bagaimana TLS Bekerja
TLS menggunakan kombinasi asymmetric encryption (untuk key exchange) dan symmetric encryption (untuk data transfer):
// TLS Handshake (disederhanakan)
// 1. Client Hello: browser kirim supported cipher suites
Client → Server: "Saya support TLS 1.3, cipher X, Y, Z"
// 2. Server Hello: server pilih cipher dan kirim certificate
Server → Client: "Pakai cipher X, ini certificate saya"
// 3. Certificate Verification: browser verifikasi certificate
Client: Cek apakah certificate ditandatangani oleh CA yang dipercaya
// 4. Key Exchange: kedua pihak membuat shared secret
Client ↔ Server: Generate session keys
// 5. Encrypted Communication
Client ↔ Server: Semua data dienkripsi dengan session keys
TLS 1.3: Penyederhanaan 1-RTT
TLS 1.3 menghapus cipher lemah (RC4, 3DES, CBC mode, SHA-1), membuang renegotiation, dan menggabungkan ClientHello + KeyShare dalam satu pesan. Hasilnya: 1 round-trip untuk koneksi baru (dari 2 di TLS 1.2), dan 0-RTT resumption untuk koneksi kedua ke server yang sama (hati-hati: 0-RTT rentan replay — jangan untuk request yang ubah state).
Perfect Forward Secrecy (PFS)
PFS memastikan bahwa kalau private key server bocor di masa depan, session terenkripsi di masa lalu tetap tidak bisa didekripsi. Kunci: key exchange harus pakai ephemeral algorithm — ECDHE atau DHE — yang menghasilkan key pair baru setiap session. Key pair ini di-discard setelah handshake. Tanpa PFS (contoh: RSA key exchange klasik), kalau attacker merekam lalu lintas TLS selama bertahun-tahun dan akhirnya mendapat private key, semua session bisa dibuka.
# Nginx: pastikan hanya cipher ECDHE/DHE (PFS)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off; # TLS 1.3 recommendation
Anatomi Cipher Suite
Nama cipher suite TLS 1.2 membaca: ECDHE-RSA-AES256-GCM-SHA384
- ECDHE — key exchange (Elliptic Curve Diffie-Hellman Ephemeral → memberi PFS)
- RSA — authentication (certificate ditandatangani dengan RSA)
- AES256 — symmetric cipher (AES 256-bit untuk data)
- GCM — cipher mode (Galois/Counter Mode → authenticated encryption, ganti CBC)
- SHA384 — MAC / PRF hash
TLS 1.3 menyederhanakan jadi cuma: cipher + hash (misal TLS_AES_256_GCM_SHA384). Key exchange dan authentication dinegosiasikan terpisah.
SSL Certificate
Certificate dikeluarkan oleh Certificate Authority (CA) dan membuktikan identitas server:
# Mendapatkan certificate gratis dari Let's Encrypt
# Menggunakan certbot
sudo certbot --nginx -d example.com -d www.example.com
# Certificate akan di-renew otomatis setiap 90 hari
sudo certbot renew --dry-run
Konfigurasi HTTPS di Nginx
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Redirect HTTP ke HTTPS
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
}
# HSTS: paksa browser selalu gunakan HTTPS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Best Practices TLS
- Gunakan TLS 1.3 (atau minimal TLS 1.2)
- Aktifkan HSTS untuk memaksa HTTPS
- Gunakan certificate gratis dari Let's Encrypt
- Redirect semua HTTP ke HTTPS
- Nonaktifkan SSL 3.0, TLS 1.0, dan TLS 1.1