SSL pinning, mobil uygulamanızın sunucuyla kurduğu HTTPS bağlantısını yalnızca belirli bir sertifika veya public key ile doğrulayarak Man-in-the-Middle (MITM) saldırılarını engelleyen bir güvenlik yöntemidir. Bu sayede, kötü niyetli bir saldırgan araya girip trafiği dinleyemez veya değiştiremez. Özellikle finans, sağlık gibi hassas veri içeren uygulamalarda kritiktir.
SSL Pinning Nedir ve Neden Önemlidir?
SSL/TLS protokolü standartta, istemci sunucunun sertifikasını cihazdaki güvenilir kök sertifika depolarına (trust store) bakarak doğrular. Ancak bir saldırgan, güvenilir bir CA’yı ele geçirir veya kullanıcıya sahte bir kök sertifika yüklerse (örneğin kurumsal proxy’ler veya kötü amaçlı yazılımlarla), bu doğrulama kolayca atlatılabilir. SSL pinning, uygulamanın yalnızca belirli bir sertifika veya public key'e güvenmesini sağlayarak bu tür saldırıları etkisiz kılar.
Önemli: SSL pinning, CA güven zincirindeki zafiyetleri ortadan kaldırarak, sertifika otoritesi bile saldırıya uğramış olsa bile uygulamanızın güvenli kalmasını sağlar.
Sertifika Pinning vs Public Key Pinning
İki temel yaklaşım vardır:
| Yöntem | Açıklama | Avantajları | Dezavantajları |
|---|---|---|---|
| Sertifika Pinning | Sunucunun tam sertifikasını veya ara sertifikayı uygulamaya gömer. | Kolay uygulanabilir. | Sertifika yenilenirse (aynı public key ile bile) uygulama güncellenmezse bağlantı kopar. |
| Public Key Pinning | Sertifika içindeki public key’in hash’ini uygulamaya gömer. | Sertifika yenilense de aynı key çifti kullanılıyorsa sorun olmaz; daha esnek. | Public key yönetimi daha karmaşıktır. |
Genellikle public key pinning önerilir; çünkü sık sertifika değişimlerinde güncelleme gerektirmez.
iOS’ta SSL Pinning Uygulaması (URLSession ile)
iOS’ta URLSession’ın URLSessionDelegate metodunu kullanarak pinning yapabilirsiniz. Adımlar şöyledir:
- Sertifikanızı veya public key hash’ini uygulama paketine ekleyin (örneğin
.derdosyası). URLSessionoluştururken özel birURLSessionDelegateatayın.didReceive challengemetodunda, sunucu tarafından gelen sertifikayı gömülü değerle karşılaştırın.- Eşleşme varsa
.performDefaultHandling, yoksa.cancelAuthenticationChallengedöndürün.
Örnek kod parçacığı (Swift):
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
guard let serverTrust = challenge.protectionSpace.serverTrust else { return }
if let serverCertificate = SecTrustGetCertificateAtIndex(serverTrust, 0) {
let serverPublicKey = SecCertificateCopyKey(serverCertificate)
// Gömülü public key ile karşılaştır
if serverPublicKey == pinnedKey {
completionHandler(.useCredential, URLCredential(trust: serverTrust))
} else {
completionHandler(.cancelAuthenticationChallenge, nil)
}
}
}Android’de SSL Pinning Uygulaması (OkHttp ile)
Android’de en yaygın yöntem OkHttp kütüphanesidir. Adımlar:
- Sertifika veya public key bilgisini bir
CertificatePinnernesnesine tanımlayın. - OkHttpClient builder’a ekleyin.
- İstekleri bu client ile yapın.
Örnek (Kotlin):
val certificatePinner = CertificatePinner.Builder()
.add("api.ornek.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
.build()
val client = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build()Public key hash’ini almak için sunucu sertifikasını openssl s_client -connect api.ornek.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64 komutuyla elde edebilirsiniz.
Sık Yapılan Hatalar ve Çözümleri
- Sertifika süresi dolduğunda bağlantı kopması: Public key pinning kullanarak veya pin’leri güncelleme mekanizması ekleyerek (örneğin backup pin) aşılabilir.
- Debug sırasında pinning çalışmaması: Proxy araçları (Charles, Burp) genellikle kendi sertifikalarını kullanır; pinning aktifken trafiği izlemek için test ortamında pinning’i devre dışı bırakın veya proxy sertifikasını kabul edin.
- Yanlış hash kullanımı: Birden fazla sertifika zinciri varsa doğru public key’i pinlediğinizden emin olun. Genellikle yaprak (leaf) sertifikanın public key’i önerilir.
SSL Pinning Güncelleme Stratejileri
SSL pinning, uygulamanız güncellenmeden sunucu sertifikası değişirse bağlantıyı engelleyebilir. Bu nedenle aşağıdaki stratejileri uygulayın:
- Yedek pin kullanımı: Ana pin yanında eski sertifikanın pin’ini de saklayın. Sertifika geçiş döneminde her iki pin de geçerli olur.
- Uzaktan yapılandırma (remote config): Pin değerlerini Firebase Remote Config gibi bir servisten çekin. Böylece uygulama güncellemesine gerek kalmadan pin’leri yenileyebilirsiniz.
- Otomatik güncelleme bildirimi: Pin geçersiz olduğunda kullanıcıya uygulamayı güncellemesi için bildirim gösterin.
SSL pinning’i diğer güvenlik önlemleriyle birlikte kullanmak önemlidir. Örneğin, JWT Access ve Refresh Token Yönetimi ile token’ların güvenli iletimini sağlayabilirsiniz. Ayrıca, API versiyonlama stratejileri ile sunucu tarafındaki değişiklikleri yönetebilirsiniz.
Sonuç olarak, SSL pinning mobil uygulamanızın güvenliğini bir üst seviyeye taşır. Özellikle hassas veri işleyen uygulamalar için bu yöntem olmazsa olmazdır. Doğru uygulandığında MITM saldırılarına karşı etkili bir kalkan oluşturur. Uygulamanızda pinning’i hayata geçirirken yukarıdaki adımları takip edin ve güncelleme stratejilerini ihmal etmeyin.
Sık Sorulan Sorular
SSL pinning uygulaması sırasında sertifika süresi dolduğunda ne yapılmalı?
Public key pinning kullanıyorsanız, sertifika yenilendiğinde aynı public key kullanılıyorsa sorun olmaz. Ancak key değişiyorsa, uygulamayı güncellemeden önce eski ve yeni pin’i birlikte (yedek pin) kullanarak geçiş süreci planlamalısınız.
iOS ve Android için SSL pinning kütüphaneleri nelerdir?
iOS'ta URLSession'in URLSessionDelegate'ini, Android'de OkHttp'nin CertificatePinner'ını kullanabilirsiniz. Ayrıca her iki platformda da TrustKit gibi üçüncü parti kütüphaneler mevcuttur.
SSL pinning uygulamak zorunlu mudur?
Zorunlu değildir, ancak özellikle finans, sağlık veya kullanıcı verilerini işleyen uygulamalar için şiddetle önerilir. MITM saldırılarına karşı ek bir güvenlik katmanı sağlar.
SSL pinning ile birlikte başka hangi güvenlik önlemleri alınmalı?
JWT token yönetimi, API rate limiting, güvenli oturum yönetimi ve veri şifreleme gibi önlemlerle desteklenmelidir. Ayrıca uygulama güncelleme mekanizması da pin güncellemeleri için kritiktir.
SSL pinning test edilirken nelere dikkat edilmeli?
Test ortamında pinning'i geçici olarak devre dışı bırakarak proxy araçlarıyla trafiği inceleyin. Ayrıca farklı sertifika geçiş senaryolarını (süre dolumu, sızıntı) simüle ederek doğru çalıştığını doğrulayın.






