SSL Pinning: esensi, mekanisme dan perlindungan dari serangan MITM

Penulis: IT Sectr Diterbitkan: 2026-03-09 Waktu membaca: 9 mnt

SSL Pinning — teknik keamanan di mana aplikasi memeriksa sertifikat server berdasarkan sidik jari atau sertifikat yang diketahui sebelumnya, bukan mengandalkan rantai kepercayaan CA. Berbeda dengan verifikasi standar, pinning mencegah penyadapan lalu lintas melalui pusat sertifikasi akar palsu. Menurut OWASP Mobile Security Testing Guide (2025), teknik ini termasuk dalam 3 kontrol teratas yang direkomendasikan untuk perlindungan terhadap serangan MITM. Tanpa pinning, penyerang dengan sertifikat akar palsu dapat mendekripsi seluruh lalu lintas HTTPS aplikasi.

Poin utama

  • SSL Pinning — pengikatan aplikasi ke sertifikat atau sidik jari server tertentu alih-alih mempercayai seluruh rantai CA
  • Serangan MITM dicegah dengan memeriksa sertifikat melalui daftar putih, bukan melalui CA publik
  • Dua jenis utama — pengikatan sertifikat (certificate pinning) dan pengikatan kunci publik (public key pinning)
  • Implementasi di iOS memerlukan delegat URLSession, di Android menggunakan CertificatePinner OkHttp atau Network Security Config
  • Rotasi kunci — kesulitan utama: saat sertifikat berubah, aplikasi perlu diperbarui melalui mekanisme pin cadangan

Apa itu SSL Pinning?

SSL Pinning — adalah mekanisme keamanan di mana aplikasi mobile atau web mengingat sertifikat tepercaya atau kunci publik server dan menolak koneksi apa pun yang sertifikatnya tidak cocok dengan yang tersimpan. Dalam skema HTTPS standar, klien memverifikasi sertifikat melalui rantai kepercayaan hingga CA akar — CA mana pun dapat menandatangani sertifikat untuk domain apa pun. SSL Pinning menghilangkan kelemahan ini: alih-alih mempercayai ratusan CA, aplikasi hanya mempercayai satu sertifikat tertentu.

Masalah verifikasi standar adalah bahwa salah satu dari ratusan CA akar dapat menerbitkan sertifikat yang valid untuk domain Anda — secara tidak sengaja atau di bawah paksaan. Penyerang yang mendapatkan akses ke proxy perusahaan dengan sertifikat akarnya sendiri dapat melakukan serangan MITM tanpa peringatan browser. SSL Pinning menutup kerentanan ini: bahkan jika CA menerbitkan sertifikat palsu, aplikasi akan menolaknya, karena sidik jari tidak cocok dengan yang tercatat.

Dalam aplikasi mobile, SSL Pinning sangat penting karena perangkat sering beroperasi di jaringan yang tidak aman — Wi-Fi publik, proxy perusahaan dengan inspeksi lalu lintas, titik akses yang terinfeksi. Menurut Verizon Mobile Security Index (2025), lebih dari 60% kebocoran data di aplikasi mobile terkait dengan penyadapan lalu lintas di tingkat transportasi.

Mengapa SSL Pinning diperlukan dalam pengembangan mobile

Aplikasi mobile mentransmisikan data sensitif — token autentikasi, informasi pembayaran, data pribadi pengguna. Tanpa perlindungan tambahan, HTTPS dapat dikompromikan melalui penggantian sertifikat akar di perangkat — misalnya, setelah menginstal profil perusahaan atau aplikasi berbahaya. SSL Pinning menjamin bahwa bahkan jika CA akar palsu diinstal di perangkat, aplikasi akan terus memverifikasi sertifikat berdasarkan daftar putihnya sendiri.

Bagaimana cara kerja SSL Pinning?

Proses SSL Pinning terdiri dari tiga tahap: mendapatkan sidik jari, verifikasi saat koneksi, dan penanganan kesalahan. Pada tahap pengembangan, insinyur mendapatkan sidik jari SHA-256 sertifikat server (openssl x509 -fingerprint -sha256) dan menyematkannya ke dalam kode aplikasi atau file konfigurasi. Pada setiap permintaan HTTPS, aplikasi menghitung sidik jari sertifikat yang diterima dan membandingkannya dengan yang tersimpan — jika nilainya tidak cocok, koneksi diputus.

Tahap pertama — pinning pada tahap pembangunan: pengembang sudah mengetahui sertifikat server sebelumnya dan menyematkan hash mereka. Tahap kedua — pinning pada koneksi pertama (trust on first use, TOFU): aplikasi mengingat sertifikat pada permintaan pertama dan menggunakannya untuk memverifikasi semua permintaan berikutnya. TOFU nyaman untuk lingkungan dinamis, tetapi rentan pada serangan pertama — jika koneksi pertama sudah disadap, sertifikat palsu akan diterima sebagai tepercaya.

Detail kritis — sidik jari cadangan (backup pins). Sertifikat memiliki masa berlaku, dan saat diganti, aplikasi yang tidak diperbarui akan kehilangan koneksi ke server. Insinyur menambahkan 2–3 sidik jari tambahan — misalnya, sidik jari sertifikat cadangan dan sidik jari CA akar. Jika sertifikat utama berubah, aplikasi memeriksa berdasarkan backup pins, dan koneksi terus berfungsi.

bash
# Mendapatkan sidik jari SHA-256 sertifikat
openssl s_client -connect example.com:443 </dev/null 2>/dev/null | \
  openssl x509 -pubkey -noout | \
  openssl pkey -pubin -outform der | \
  openssl dgst -sha256 -binary | \
  base64

Jenis SSL Pinning

Ada dua pendekatan utama untuk implementasi pinning: pengikatan ke seluruh sertifikat (certificate pinning) dan pengikatan ke kunci publik (public key pinning). Setiap pendekatan memiliki kekuatan dan keterbatasan yang mempengaruhi keamanan dan kemudahan pemeliharaan.

JenisObjek fiksasiFleksibilitasKeamanan
Certificate PinningSeluruh sertifikat X.509Rendah — saat sertifikat berubah, perlu pembaruanTinggi — pengikatan tepat
Public Key PinningKunci publik sertifikatSedang — kunci bisa ada di sertifikat baruTinggi — kurang sensitif terhadap detail sertifikat
Hash PinningHash SHA-256 sertifikat atau kunciTinggi — dapat mengubah sertifikat tanpa mengubah kunciSedang — tergantung pada kekuatan hash

Certificate Pinning

Pengikatan ke sertifikat — metode yang paling ketat. Aplikasi menyimpan salinan sertifikat tepercaya atau sidik jari SHA-256-nya dan membandingkannya dengan sertifikat server pada setiap koneksi HTTPS. Metode ini memberikan keamanan maksimum, tetapi menimbulkan masalah saat rotasi — sertifikat biasanya berlaku 1–2 tahun, setelah itu diperlukan pembaruan paksa aplikasi. Direkomendasikan untuk sistem kritis dengan siklus pembaruan terkendali.

Public Key Pinning

Fiksasi kunci publik — pendekatan yang lebih fleksibel. Alih-alih seluruh sertifikat, aplikasi hanya mengingat kunci publik RSA atau ECDSA server. Kunci dapat tetap tidak berubah saat penerbitan ulang sertifikat, jika perusahaan menggunakan pasangan kunci yang sama. Ini mengurangi frekuensi pembaruan aplikasi. Namun, jika kunci dikompromikan, diperlukan penggantian berantai di semua klien.

SSL Pinning di iOS

Di platform Apple, SSL Pinning diimplementasikan melalui delegat URLSession. Pengembang membuat kelas yang mengimplementasikan protokol URLSessionDelegate dan menimpa metode didReceive challenge, di mana ia secara manual memeriksa sertifikat server terhadap sidik jari yang tersimpan. Pendekatan alternatif — menggunakan Alamofire dengan ServerTrustManager, yang menyederhanakan konfigurasi.

swift
class SSLPinningDelegate: NSObject, URLSessionDelegate {
    let pinnedHash = "sha256/Wi24BE7j5qLk0iLvPq6ePEsVRqZ1yW0F6wLg="

    func urlSession(_ session: URLSession,
        didReceive challenge: URLAuthenticationChallenge,
        completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {

        guard let serverTrust = challenge.protectionSpace.serverTrust
            else { return completionHandler(.cancelAuthenticationChallenge, nil) }

        if validate(serverTrust, pinnedHash) {
            completionHandler(.useCredential, URLCredential(trust: serverTrust))
        } else {
            completionHandler(.cancelAuthenticationChallenge, nil)
        }
    }
}

Dalam contoh, delegat menerima permintaan autentikasi dari URLSession, mengekstrak serverTrust dari challenge dan membandingkan sidik jari SHA-256 sertifikat dengan yang tersimpan. Jika sidik jari cocok — koneksi dilanjutkan, jika tidak challenge ditolak. Untuk produksi, perlu menambahkan pemeriksaan beberapa backup pins dan pencatatan kesalahan untuk pemantauan.

Network Security Config di iOS

Mulai iOS 14, Apple menambahkan dukungan bawaan untuk Certificate Pinning melalui Info.plist. Pengembang menentukan sertifikat tepercaya di kunci NSAppTransportSecurity dengan subkamus NSPinnedDomains. Pendekatan ini tidak memerlukan penulisan kode, tetapi kurang fleksibel — tidak dapat mengubah pin secara dinamis atau mencatat kesalahan verifikasi.

SSL Pinning di Android

Di Android ada tiga cara utama untuk mengimplementasikan SSL Pinning: melalui CertificatePinner dari pustaka OkHttp, melalui Network Security Config di XML, dan melalui pemeriksaan kustom di HttpsURLConnection. OkHttp — pendekatan paling populer dan direkomendasikan, digunakan di Retrofit dan klien HTTP lainnya.

kotlin
val certificatePinner = CertificatePinner.Builder()
    .add("api.example.com",
        "sha256/Wi24BE7j5qLk0iLvPq6ePEsVRqZ1yW0F6wLg=")
    .add("api.example.com",
        "sha256/FiPq6ePEsVRqZ1yW0F6wLgWi24BE7j5qLk0iL=")  // pin cadangan
    .build()

val client = OkHttpClient.Builder()
    .certificatePinner(certificatePinner)
    .build()

Dalam konfigurasi OkHttp, pengembang menentukan domain dan satu atau beberapa sidik jari SHA-256. Pada sidik jari pertama, OkHttp membandingkan sertifikat server dengan pin yang ditentukan. Jika tidak ada kecocokan, klien melemparkan SSLPeerUnverifiedException. Pin cadangan wajib — tanpa itu, saat sertifikat berubah, permintaan API akan segera mulai gagal.

Network Security Configuration di Android

Android mendukung Certificate Pinning deklaratif melalui konfigurasi XML mulai API 24. File res/xml/network_security_config.xml berisi daftar domain dan sidik jarinya. Metode ini nyaman untuk konfigurasi statis, tetapi tidak memungkinkan implementasi TOFU atau logika pemeriksaan kustom dengan pencatatan anomali.

xml
<!-- res/xml/network_security_config.xml -->
<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">api.example.com</domain>
        <pin-set expiration="2027-12-31">
            <pin digest="SHA-256">
                Wi24BE7j5qLk0iLvPq6ePEsVRqZ1yW0F6wLg=</pin>
            <pin digest="SHA-256">
                FiPq6ePEsVRqZ1yW0F6wLgWi24BE7j5qLk0iL=</pin>
        </pin-set>
    </domain-config>
</network-security-config>

Kelebihan dan kekurangan SSL Pinning

SSL Pinning secara signifikan meningkatkan keamanan aplikasi mobile, tetapi menimbulkan kompleksitas operasional. Kelebihan utama — perlindungan terhadap serangan MITM bahkan jika CA akar dikompromikan. Aplikasi hanya mempercayai sertifikat yang secara eksplisit ditentukan oleh pengembang, bukan seluruh infrastruktur pusat sertifikasi publik. Ini sangat penting untuk aplikasi keuangan, aplikasi perpesanan, dan aplikasi dengan data sensitif.

Kekurangan utama — kompleksitas rotasi sertifikat. Jika sertifikat kedaluwarsa atau dicabut, pengguna tanpa pembaruan aplikasi kehilangan koneksi. Ini diatasi melalui pin cadangan dan mekanisme pembaruan bertahap: aplikasi baru mengetahui sertifikat lama dan baru, dan setelah pembaruan penuh pengguna, pin lama dihapus dari kode. Disarankan untuk menyertakan minimal 2 pin cadangan — satu untuk sertifikat saat ini, satu untuk masa depan.

Kompromi lainnya — ketidakmampuan menggunakan proxy publik untuk debugging lalu lintas (Charles Proxy, Burp Suite) tanpa menonaktifkan pinning. Ini mempersulit debugging permintaan jaringan pada tahap pengembangan. Solusi — kompilasi bersyarat: di build debug pinning dinonaktifkan, di build release diaktifkan. OWASP merekomendasikan penggunaan flag BuildConfig.DEBUG untuk peralihan.

AspekKelebihanKekurangan
KeamananPerlindungan dari MITM melalui CA palsuKompleksitas saat kunci dikompromikan
PemeliharaanKontrol kepercayaan yang eksplisitRotasi memerlukan pembaruan aplikasi
DebuggingJaminan koneksi ke server yang benarPemblokiran proxy debugging

Pertanyaan yang sering diajukan

Apa perbedaan antara SSL Pinning dan verifikasi HTTPS standar?

Verifikasi HTTPS standar mempercayai sertifikat apa pun yang ditandatangani oleh CA akar yang dikenal. SSL Pinning hanya mempercayai sertifikat atau kunci tertentu — jika CA menerbitkan sertifikat palsu, aplikasi akan menolaknya.

Seberapa sering sertifikat yang dipin perlu diperbarui?

Sertifikat biasanya berlaku 1–2 tahun. Disarankan untuk memperbarui pin 3–6 bulan sebelum sertifikat saat ini kedaluwarsa, menambahkan sidik jari baru sebagai pin cadangan, dan setelah rotasi menghapus yang lama.

Bisakah SSL Pinning digunakan dengan CDN?

Ya, tetapi perlu diingat bahwa CDN dapat mengubah sertifikat saat beralih antar server edge. Disarankan untuk mengikat ke kunci publik, bukan ke sertifikat tertentu, dan menggunakan beberapa pin cadangan.

Apa yang terjadi jika terjadi kesalahan verifikasi SSL Pinning?

Koneksi diputus dengan kesalahan — di Android ini adalah SSLPeerUnverifiedException, di iOS challenge ditolak dengan .cancelAuthenticationChallenge. Aplikasi harus menangani kesalahan ini dengan benar dan memberi tahu pengguna.

Apakah SSL Pinning wajib untuk semua aplikasi mobile?

Tidak, tetapi OWASP merekomendasikannya untuk aplikasi yang bekerja dengan data sensitif: perbankan, medis, sistem perusahaan. Untuk aplikasi read-only sederhana, verifikasi HTTPS standar dengan sertifikat EV biasanya sudah cukup.

Kesimpulan

  • SSL Pinning — pengikatan aplikasi ke sertifikat atau kunci server tertentu, menghilangkan ketergantungan pada rantai kepercayaan CA
  • Dua jenis utama — certificate pinning (ketat, terikat ke sertifikat) dan public key pinning (fleksibel, terikat ke kunci)
  • Pin cadangan — elemen wajib: minimal 2 sidik jari cadangan untuk rotasi sertifikat yang lancar
  • iOS — implementasi melalui URLSessionDelegate dengan pemeriksaan serverTrust manual atau Alamofire ServerTrustManager
  • Android — OkHttp CertificatePinner (pemrograman) atau Network Security Config (deklaratif melalui XML)
  • Risiko — rotasi sertifikat yang dipin yang salah menyebabkan pengguna kehilangan koneksi hingga pembaruan aplikasi
  • Rekomendasi — gunakan SSL Pinning untuk aplikasi dengan data keuangan, medis, atau perusahaan

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga