Transport Layer Security (TLS) adalah protokol kriptografi yang mengenkripsi jalur antara browser dan server, sehingga isi permintaan, isi respons, dan identitas server terlindungi dari pihak yang berada di tengah jaringan. Kelemahannya jarang terletak pada algoritma yang dipilih, melainkan pada keputusan konfigurasi: versi protokol yang masih diaktifkan, cipher suite yang tersisa, dan pintu fallback yang tertinggal terbuka. Kegagalan semacam ini tercatat sebagai A04:2025 Cryptographic Failures pada OWASP Top 10:2025. Topik ini membahas permukaan serangan per versi protokol, serangan downgrade, konfigurasi yang layak digunakan, serta pemeriksaan permukaan serangan dan konfigurasinya dengan OpenSSL di lab. Setelah mengikuti topik ini, pembaca dapat menilai daftar protokol dan cipher suite sebuah server dengan kriteria yang jelas.
Versi protokol dan cipher suite#
Permukaan serangan TLS ditentukan lebih dahulu oleh versi protokol yang diaktifkan server, sebelum atribut konfigurasi lain dipertimbangkan. SSLv2 dan SSLv3 sudah lama ditinggalkan, dan POODLE pada 2014 mengakhiri sisa kegunaan SSLv3 karena celah padding pada mode CBC memungkinkan isi respons dibaca setelah banyak percobaan. TLS 1.0 dan TLS 1.1 resmi usang melalui RFC 8996, sehingga versi yang tersisa hanyalah TLS 1.2 dan TLS 1.3. TLS 1.3 yang dirilis pada 2018 menyederhanakan handshake, yaitu urutan pesan perundingan kunci, dan menghapus algoritma lama dari daftar negosiasinya. Alur kerja protokol ini, lapis demi lapis pada lapisan jaringan, didalami pada jalur Networking.
Perbedaan permukaan serangan antarversi dapat diukur dari jumlah cipher suite-nya, yaitu pasangan algoritma penyandian dan pertukaran kunci yang disepakati satu koneksi. Perintah berikut menggunakan OpenSSL yang tersedia di lab untuk mencantumkan cipher suite TLS 1.3 dan menghitung cipher suite TLS 1.2 pada urutan kekuatan bawaannya.
# versi OpenSSL yang dipakai seluruh percobaan pada topik ini
openssl version
# seluruh cipher suite TLS 1.3 yang dikenal OpenSSL
openssl ciphers -v -tls1_3 | awk '$2 == "TLSv1.3" {print $1}'
# banyaknya cipher suite TLS 1.2 pada urutan kekuatan bawaan
openssl ciphers -v 'TLSv1.2:@STRENGTH' | awk '$2 == "TLSv1.2"' | wc -lOpenSSL 3.5.7 9 Jun 2026 (Library: OpenSSL 3.5.7 9 Jun 2026)
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_GCM_SHA256
86Seluruh cipher suite TLS 1.3 hanyalah tiga nama, dan ketiganya menggunakan penyandian AEAD (Authenticated Encryption with Associated Data), yaitu jenis penyandian yang menjamin kerahasiaan dan integritas dalam satu operasi. Sebaliknya, string TLSv1.2:@STRENGTH menghasilkan 86 cipher suite TLS 1.2 pada build OpenSSL 3.5.7 di lab ini, dan daftar itu masih memuat suite berbasis CBC serta mekanisme pertukaran kunci lama yang tidak dibutuhkan aplikasi modern. Kontras angka tiga melawan 86 itulah wujud permukaan serangan: semakin banyak suite yang boleh dinegosiasikan, semakin banyak jalur lemah yang harus ditutup secara manual. Karena itu, konfigurasi TLS 1.2 yang sehat memilih subset ECDHE dengan AES-GCM atau ChaCha20, bukan mewariskan seluruh daftar bawaan.
Serangan downgrade dan cara menutupnya#
Serangan downgrade memaksa koneksi menggunakan protokol yang lebih lemah daripada yang sebenarnya didukung kedua pihak. Pelaku berada di tengah jaringan, lalu menyerang proses perundingannya: membuat jabat tangan versi baru gagal sehingga klien jatuh ke versi lama, atau melucuti TLS sepenuhnya pada lalu lintas HTTP yang pertama. Varian kedua dikenal sebagai sslstrip, yaitu menyunting respons HTTP agar seluruh tautan https pada halamannya ditulis ulang menjadi http sebelum sampai ke browser. Diagram berikut memperlihatkan alurnya pada jaringan publik.
Dua pertahanan menutup skenario di atas. Pertama, versi protokol lama dimatikan sehingga tidak ada target fallback yang tersisa, sebab POODLE berhasil justru karena browser masih bersedia jatuh ke SSLv3 ketika jabat tangan TLS sengaja digagalkan pelaku. Kedua, TLS 1.3 menyediakan proteksi downgrade: server TLS 1.3 yang terpaksa bernegosiasi pada versi lebih lama menyematkan penanda pada nilai acak pesan ServerHello, sehingga klien yang mampu TLS 1.3 mendeteksi pemaksaan itu dan memutus koneksi. Pada lapisan HTTP, header Strict-Transport-Security (HSTS) memerintahkan browser menghubungi domain hanya melalui HTTPS selama masa berlaku yang dinyatakan, sehingga pelucutan pada kunjungan berikutnya tidak lagi efektif. Kunjungan pertama tetap terpapar, dan itulah alasan HSTS wajib terpasang sedini mungkin, bukan dipasang setelah insiden.
Konfigurasi yang layak digunakan#
Konfigurasi yang layak memuat dua keputusan: hanya TLS 1.2 dengan cipher terpilih dan TLS 1.3 yang diaktifkan, serta HSTS terpasang pada setiap respons. Contoh berikut memperlihatkan bentuknya pada blok server nginx.
server {
listen 443 ssl;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
add_header Strict-Transport-Security "max-age=31536000" always;
}Direktif ssl_protocols membatasi versi yang dapat diperundingkan, sedangkan ssl_ciphers membatasi cipher suite TLS 1.2 ke empat suite ECDHE berbasis AEAD. Cipher suite TLS 1.3 tidak diatur oleh ssl_ciphers, melainkan aktif otomatis bersama versi 1.3. Nilai always membuat header terkirim pada semua kode status, karena tanpa nilai itu header hanya menyertai kelompok status sukses dan pengalihan. Konfigurasi seperti ini mudah ditulis, tetapi daftar protokol dan cipher pada server nyata sering berubah tanpa disadari akibat pembaruan sistem atau tangan orang lain, sehingga penilaiannya perlu diotomatisasi.
Skrip berikut menilai dua konfigurasi dari daftar protokol dan cipher-nya dengan kriteria yang sama seperti pembahasan di atas: protokol di bawah TLS 1.2 ditandai, kompresi TLS ditandai karena membuka serangan CRIME, dan cipher RC4 atau 3DES ditandai.
"""Menilai konfigurasi TLS dari daftar protokol dan cipher yang diaktifkan."""
PROTOKOL_USANG = {"SSLv2", "SSLv3", "TLSv1", "TLSv1.1"}
CIPHER_LEMAH = ("RC4", "DES-CBC3")
def nilai_konfigurasi(nama, protokol, kompresi, cipher):
"""Mencetak temuan untuk satu konfigurasi TLS."""
print(f"== Konfigurasi {nama} ==")
temuan = []
usang = [p for p in protokol if p in PROTOKOL_USANG]
if usang:
temuan.append("protokol usang aktif: " + ", ".join(usang))
if kompresi:
temuan.append("kompresi TLS aktif (rentan CRIME)")
lemah = [c for c in cipher if any(s in c for s in CIPHER_LEMAH)]
if lemah:
temuan.append("cipher lemah aktif: " + ", ".join(lemah))
if not temuan:
print("tanpa temuan")
for baris in temuan:
print(baris)
print()
nilai_konfigurasi(
"cacat",
["SSLv3", "TLSv1", "TLSv1.2"],
True,
["ECDHE-RSA-AES128-GCM-SHA256", "RC4-SHA", "DES-CBC3-SHA"],
)
nilai_konfigurasi(
"layak",
["TLSv1.2", "TLSv1.3"],
False,
["ECDHE-RSA-AES128-GCM-SHA256", "ECDHE-RSA-AES256-GCM-SHA384"],
)== Konfigurasi cacat ==
protokol usang aktif: SSLv3, TLSv1
kompresi TLS aktif (rentan CRIME)
cipher lemah aktif: RC4-SHA, DES-CBC3-SHA
== Konfigurasi layak ==
tanpa temuanKonfigurasi cacat melanggar ketiga kriteria sekaligus, dan setiap baris temuannya menunjuk keputusan yang berbeda: masa protokol, opsi kompresi, dan daftar cipher. Kompresi TLS patut dijelaskan tersendiri karena terdengar tidak berbahaya, padahal serangan CRIME memanfaatkan perubahan panjang data terkompresi untuk menerka secret yang menyertainya, sehingga kompresi pada lapisan TLS ditiadakan pada TLS 1.3 dan harus dimatikan manual pada TLS 1.2. Pemeriksaan semacam ini cocok dijadikan langkah pipeline konfigurasi sebelum perubahan sampai ke server produksi.
Memeriksa server secara langsung#
Alat pemeriksaan untuk server nyata adalah openssl s_client, yaitu klien TLS dari baris perintah yang melaporkan protokol terpilih, cipher yang disepakati, dan rantai sertifikat. Perintah berikut memaksa s_client bernegosiasi dengan TLS 1.2 terhadap sebuah host lab.
# tidak-dijalankan
# memeriksa protokol dan cipher pada server lab sendiri (membutuhkan akses jaringan ke server tujuan)
openssl s_client -connect lab.test:443 -tls1_2 < /dev/nullBlok di atas tidak dijalankan di sandbox karena koneksi keluar tidak tersedia di lingkungannya. Pada jaringan sendiri, perhatikan baris Protocol dan Cipher yang menunjukkan hasil perundingan, serta kegagalan koneksi apabila versi yang diminta tidak didukung server. Uji yang paling informatif adalah memaksa versi usang: perintah serupa dengan opsi -tls1_1 seharusnya gagal, dan keberhasilannya justru merupakan temuan yang wajib dilaporkan. Pemeriksaan hanya dilakukan terhadap server milik sendiri atau target yang mendapat izin, sesuai kerangka etika yang menjadi dasar jalur ini.
Kesalahan umum#
Empat kekeliruan berikut paling sering ditemukan pada konfigurasi TLS.
- Mengandalkan pengalihan HTTP ke HTTPS saja. Permintaan pertama tetap dikirim melalui HTTP polos dan sempat dilucuti sslstrip sebelum pengalihan berjalan. Pasang HSTS agar browser menolak HTTP pada kunjungan berikutnya.
- Mewariskan daftar cipher bawaan sistem. Build OpenSSL pada distribusi lama masih mengaktifkan suite CBC dan RC4, sehingga konfigurasinya tampak aman karena tidak pernah disentuh. Nyatakan daftarnya secara eksplisit setiap kali versi OpenSSL naik.
- Mengaktifkan protokol lama demi klien lama tanpa data pendukung. Periksa log versi TLS yang benar-benar digunakan pengguna lebih dahulu, karena klien yang dimaksud biasanya sudah tidak ada.
- Menganggap konfigurasi selesai setelah diperiksa sekali. Standar yang layak hari ini dapat usang dalam beberapa tahun, sehingga pemeriksaan dijadwalkan berulang, misalnya bersama pembaruan sistem besar.
Ringkasan#
- Keputusan versi protokol adalah keputusan keamanan terbesar pada TLS: hanya TLS 1.2 dengan cipher terpilih dan TLS 1.3 yang layak diaktifkan.
- TLS 1.3 menyusutkan permukaan serangan menjadi tiga cipher suite AEAD, berbanding dengan 86 nama pada daftar TLS 1.2 bawaan OpenSSL 3.5.7 di lab ini.
- Serangan downgrade ditutup tiga lapis: protokol lama dimatikan, proteksi downgrade TLS 1.3 aktif, dan HSTS mencegah pelucutan HTTP.
openssl s_clientmemeriksa hasil konfigurasi pada server yang berhak diperiksa, dan pemeriksaan dijadwalkan berulang karena standar bergerak.
Referensi#
- A04:2025 Cryptographic Failures — OWASP Top 10 — Kategori yang menaungi kegagalan konfigurasi TLS dan kriptografi aplikasi web.
- Transport Layer Protection Cheat Sheet — OWASP — Panduan konfigurasi TLS pada server, termasuk pemilihan versi protokol dan cipher suite.