SSL Pinning Nedir?
SSL Pinning (Certificate Pinning), bir uygulamanın yalnızca belirli bir SSL sertifikasına veya public key'e güvenmesini sağlayan güvenlik mekanizmasıdır. Normal SSL doğrulamasında tarayıcı tüm güvenilir CA'lara güvenir; pinning ile uygulama yalnızca belirlenen sertifika/key ile bağlantı kabul eder.
Bu mekanizma özellikle mobil uygulamalarda ve API iletişiminde man-in-the-middle (MITM) saldırılarını önlemek için kullanılır.
Pinning Türleri
| Pinning Türü | Sabitlenen | Esneklik | Güvenlik |
|---|---|---|---|
| Certificate Pinning | Tüm sertifika | Düşük | En yüksek |
| Public Key Pinning | SPKI (public key hash) | Orta | Yüksek |
| CA Pinning | Sertifika otoritesi | Yüksek | Orta |
Yaygın SSL Pinning Hataları
Hata 1: Sertifika Yenilendi Ama Pin Güncellenmedi
En sık karşılaşılan sorun. SSL sertifikası yenilendiğinde certificate pinning kullanılıyorsa, yeni sertifikanın pini uygulama kodundakiyle eşleşmez.
Belirtiler
- Uygulama API çağrısı yapamıyor, "SSL Handshake Error" veya "Certificate verification failed"
- Web sitesi tarayıcıda çalışıyor ama uygulama bağlanamıyor
- Sertifika yenilemesi sonrası aniden tüm kullanıcılar etkileniyor
Çözüm
- Public Key Pinning kullanın: Sertifika değişse bile aynı key pair kullanılabilir
- Backup Pin ekleyin: Her zaman en az 2 pin sabitleyin (aktif + yedek)
- Uygulama güncellemesi: Yeni pini içeren güncelleme yayınlayın
Hata 2: Proxy/CDN Sertifika Değişikliği
Cloudflare gibi CDN servisleri kendi SSL sertifikalarını kullanır. CDN sertifikası değiştiğinde pin uyumsuzluğu oluşur.
Çözüm
- CDN arkasında pinning kullanmaktan kaçının veya root CA'yı pinleyin
- CDN'in (Cloudflare) origin certificate'ini pinleyin
Hata 3: Android Network Security Config Hatası
<!-- Android: res/xml/network_security_config.xml -->
<network-security-config>
<domain-config>
<domain includeSubdomains="true">api.example.com</domain>
<pin-set expiration="2026-06-01">
<!-- Aktif pin -->
<pin digest="SHA-256">base64EncodedSHA256Hash=</pin>
<!-- Yedek pin (farklı key ile) -->
<pin digest="SHA-256">backupBase64Hash=</pin>
</pin-set>
</domain-config>
</network-security-config>
⚠️ expiration tarihi önemli — süre dolduğunda pinning otomatik devre dışı kalır ve uygulama çalışmaya devam eder.
Hata 4: iOS ATS Çakışmaları
// iOS: URLSession ile pinning
func urlSession(_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
guard let serverTrust = challenge.protectionSpace.serverTrust,
let serverCert = SecTrustGetCertificateAtIndex(serverTrust, 0) else {
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
// Public key hash karşılaştırması yapın
}
Pin Hash Nasıl Hesaplanır?
# Sertifikadan SPKI pin hash hesaplama
openssl x509 -in certificate.crt -pubkey -noout | \
openssl pkey -pubin -outform der | \
openssl dgst -sha256 -binary | \
openssl enc -base64
# Çalışan sunucudan pin alma
openssl s_client -connect api.example.com:443 -servername api.example.com | \
openssl x509 -pubkey -noout | \
openssl pkey -pubin -outform der | \
openssl dgst -sha256 -binary | \
openssl enc -base64
Güvenli SSL Pinning Stratejileri
- Public Key Pinning tercih edin: Sertifika yenilendiğinde aynı key pair ile yeni sertifika alabilirsiniz
- Backup pin ekleyin: Her zaman yedek bir public key pini sabitleyin
- Pin sona erme tarihi belirleyin: Android'de
expirationözelliği ile acil durumlarda koruma - Remote pin güncellemesi: Pin listesini uzaktan güncelleyebilecek bir mekanizma kurun
- Root CA pinleme: En esnek yöntem — CA değişmediği sürece sertifika yenilemelerinden etkilenmez
HTTP Public Key Pinning (HPKP) — Kullanılmıyor
HPKP, web tarayıcılarında public key pinning yapmak için kullanılan bir HTTP header'ıydı. Ancak yanlış yapılandırıldığında siteyi kalıcı olarak erişilemez yapabildiği için 2020'de tüm tarayıcılardan kaldırıldı. Yerine Certificate Transparency ve Expect-CT header'ı geçmiştir.
Sonuç
SSL Pinning, mobil uygulamalar ve API güvenliği için güçlü bir MITM koruma katmanıdır. Ancak sertifika yenileme süreçleriyle uyumlu şekilde yönetilmelidir. Public key pinning, backup pin kullanımı ve expiration tarihi belirleme — bu üç uygulama, pinning kaynaklı arızaları önlemenin en etkili yoludur.