Serangan Man-in-the-Middle (MITM) adalah salah satu ancaman paling umum terhadap aplikasi mobile. Pelaku berhasil “mencegat” komunikasi antara aplikasi Anda dan server, lalu dapat membaca atau memodifikasi data sensitif (token, kredensial, dll). Di Android, salah satu cara efektif mencegah MITM adalah dengan Certificate Pinning—memastikan hanya sertifikat tertentu saja yang diterima.

1. Apa itu Serangan MITM di Android?
- Penyerang memposisikan diri di antara client (aplikasi Anda) dan server.
- Ia menangkap paket HTTPS, memecahkan enkripsi (atau menyuntikkan sertifikat palsu), lalu meneruskan data.
- Akibatnya, data terenkripsi Anda bisa dibaca atau diubah tanpa terdeteksi oleh client maupun server.
2. Penyebab Terjadinya MITM
Berikut adalah beberapa penyebab umum terjadinya serangan Man-in-the-Middle (MITM) di Android:
1. Penggunaan Jaringan Wi-Fi Publik yang Tidak Aman
- Banyak pengguna Android yang terkoneksi ke Wi-Fi publik (misalnya di kafe, bandara) tanpa menyadari jaringan tersebut bisa dengan mudah dimodifikasi oleh penyerang.
2. Sertifikat SSL yang Tidak Diverifikasi dengan Benar
- Jika aplikasi tidak memverifikasi sertifikat server dengan benar (misalnya, tidak menggunakan
HttpsURLConnection
dengan pengaturan aman atau menggunakanOkHttp
tanpa pinning), maka aplikasi bisa menerima sertifikat palsu dari penyerang.
3. Tidak Menggunakan HTTPS
- Aplikasi yang masih menggunakan HTTP biasa (tidak terenkripsi) membuka peluang besar untuk MITM karena data dikirim dalam bentuk plaintext.
4. Penggunaan Library Pihak Ketiga yang Tidak Aman
- Beberapa library bisa memiliki konfigurasi SSL yang lemah atau bahkan mengabaikan validasi sertifikat, memungkinkan intersepsi data.
5. Debuggable Build Tanpa Pembatasan
- Jika aplikasi Android di-release dalam mode debug atau tidak menonaktifkan fitur debug pada release build, penyerang bisa menyuntikkan traffic interception tools seperti mitmproxy.
6. Perangkat yang Sudah Di-root
- Di perangkat yang sudah di-root, penyerang bisa menginstal sertifikat CA palsu dan memaksa aplikasi menerima koneksi tidak sah.
7. Certificate Authority (CA) yang Disusupi
- Jika penyerang berhasil mendapatkan sertifikat dari CA yang terpercaya (karena celah keamanan), maka koneksi tetap terlihat “aman” oleh aplikasi.
8. Tidak Menggunakan Certificate Pinning
- Tanpa pinning, aplikasi akan menerima sertifikat apa pun yang valid secara umum (dari CA mana pun), termasuk yang palsu.
Penting bagi developer Android untuk menggunakan praktik keamanan terbaik seperti:
- Selalu gunakan HTTPS,
- Implementasi certificate pinning,
- Matikan mode debug pada produksi,
- Validasi sertifikat dengan benar.
3. Mengapa Certificate Pinning?
Tanpa pinning, Android akan mempercayai semua Certificate Authority (CA) yang sudah di-bundle di sistem. Jika salah satu CA tersebut berhasil disusupi atau pihak ketiga memasang sertifikat palsu di perangkat, aplikasi Anda masih akan terhubung. Dengan pinning, Anda “mengunci” pada fingerprint (hash) public key spesifik; jika sertifikat server berubah, koneksi otomatis ditolak.

4. Implementasi Certificate Pinning dengan OkHttp
Retrofit pada dasarnya menggunakan OkHttp sebagai HTTP client. Kita dapat mengonfigurasi CertificatePinner pada OkHttpClient, lalu menyuntikkannya ke Retrofit.
Membuat CertificatePinner
import okhttp3.CertificatePinner
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
// Ganti domain dan fingerprint dengan milik Anda
val pinner = CertificatePinner.Builder()
.add("your.api.domain.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
.build()
val okHttpClient = OkHttpClient.Builder()
.certificatePinner(pinner)
.build()
val retrofit = Retrofit.Builder()
.baseUrl("https://your.api.domain.com/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
Penjelasan
.add(hostname, pin)
: menetapkan bahwa untuk hostname tersebut, hanya sertifikat dengan public key ber-hash SHA-256 sama persis yang diperbolehkan.- hostname adalah domain base url yang digunakan tapi tanpa htts://
- Jika pinning gagal, OkHttp akan melempar
SSLPeerUnverifiedException
dan koneksi diblokir.
4. Mendapatkan SHA-256 Public Certificate Key
1. Masuk ke https://ssllabs.com/ssltest

2. Pada field Hostname isikan dengan hostname yang akan dicari Certificate Key nya. lalu klik Submit

3. Tunggu proses scanning berjalan, jika sudah selesai klik salah satu Server yang ada

4. Scroll sampai menemukan Certificate nya. Pin nya berada di row Subject. jika di scroll ke bawah mungkin akan menemukan Certificate lain. kita bisa coba satu per satu key yang ada sampai kita menemukan key yang valid. copy text setelah Pin SHA256:
5. Sesuaikan kode nya. paste code setelah sha256/
import okhttp3.CertificatePinner
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
// Ganti domain dan fingerprint dengan milik Anda
val pinner = CertificatePinner.Builder()
.add("your.api.domain.com", "sha256/yDu9og255NN5GEf+Bwa9rTrqFQ0EydZ0r1FCh9TdAW4=")
.build()
val okHttpClient = OkHttpClient.Builder()
.certificatePinner(pinner)
.build()
val retrofit = Retrofit.Builder()
.baseUrl("https://your.api.domain.com/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
Implementasi Cert Pinning di Android telah selesai. kini aplikasi telah aman dari serangan MITM.
Lalu Apakah certificate yang sudah diketahui public key-nya mudah dipalsukan atau direproduksi oleh hacker?
Tidak. Meskipun public key bisa dilihat oleh siapa saja, private key yang digunakan untuk menandatangani komunikasi tetap aman dan tidak bisa ditebak. Tanpa private key, hacker tidak dapat membuat sertifikat palsu yang valid dengan public key tersebut. Inilah alasan mengapa Certificate Pinning sangat efektif—selama public key asli tidak berubah, hanya sertifikat sah dari server Anda yang bisa diterima.
5. Tips dan Praktik Terbaik
- Multiple Pins: Anda dapat memasang beberapa pin untuk satu domain (misalnya pin SHA-256 untuk sertifikat saat ini dan cadangan saat rotasi sertifikat) untuk menghindari downtime.
- Backup Pins: Sertakan satu pin untuk CA yang menerbitkan sertifikat Anda.
- Update Pin Otomatis: Setelah sertifikat server berganti, perbarui pin di aplikasi dan rilis update.
- Gunakan Obfuscation: Penyerang bisa saja memodifikasi aplikasi / APK yang telah jadi, gunakan obfuscation agar kode yang telah jadi tidak mudah di bongkar pasang oleh penyerang
6. Kesimpulan
Certificate Pinning dengan Retrofit & OkHttp adalah lapisan keamanan esensial untuk mencegah serangan MITM. Langkah utamanya:
- Ekstrak SHA-256 public key sertifikat server (debug & release).
- Konfigurasikan
CertificatePinner
di OkHttpClient. - Gunakan OkHttpClient tersebut pada Retrofit.
Dengan begitu, aplikasi Android Anda hanya akan terhubung ke server dengan sertifikat yang sudah tervalidasi, melindungi data pengguna dari penyadapan atau manipulasi.