SSL Pinning: özü, mekanizması ve MITM saldırılarından koruma

Yazar: IT Sectr Yayınlanma: 2026-03-09 Okuma süresi: 9 dk

SSL Pinning, uygulamanın CA güven zincirine güvenmek yerine, sunucu sertifikasını önceden bilinen bir parmak izi veya sertifikaya göre doğruladığı bir güvenlik tekniğidir. Standart doğrulamanın aksine, sabitleme, sahte kök sertifika yetkilileri aracılığıyla trafiğin ele geçirilmesini önler. OWASP Mobile Security Testing Guide (2025)'a göre, bu teknik MITM saldırılarına karşı koruma için en iyi 3 önerilen kontrolden biridir. Sabitleme olmadan, sahte kök sertifikaya sahip bir saldırgan, uygulamanın tüm HTTPS trafiğinin şifresini çözebilir.

Önemli Noktalar

  • SSL Pinning — tüm CA zincirine güvenmek yerine uygulamayı belirli bir sertifikaya veya sunucu parmak izine bağlama
  • MITM saldırıları, genel CA'lar aracılığıyla değil, beyaz listeye karşı sertifika doğrulaması yapılarak önlenir
  • İki ana tür — sertifika sabitleme (certificate pinning) ve açık anahtar sabitleme (public key pinning)
  • Uygulama iOS'ta URLSession delegesi gerektirir, Android'de OkHttp CertificatePinner veya Network Security Config kullanır
  • Anahtar döndürme — ana zorluk: sertifika değiştiğinde, yedek pin mekanizması aracılığıyla uygulamanın güncellenmesi gerekir

SSL Pinning Nedir?

SSL Pinning, mobil veya web uygulamasının güvenilir bir sunucu sertifikasını veya açık anahtarı hatırladığı ve sertifikası saklananla eşleşmeyen tüm bağlantıları reddettiği bir güvenlik mekanizmasıdır. Standart HTTPS şemasında, istemci, kök CA'ya kadar olan güven zinciri aracılığıyla sertifikayı doğrular — herhangi bir CA, herhangi bir alan adı için bir sertifika imzalayabilir. SSL Pinning bu zayıflığı ortadan kaldırır: yüzlerce CA'ya güvenmek yerine, uygulama yalnızca belirli bir sertifikaya güvenir.

Standart doğrulamanın sorunu, yüzlerce kök CA'dan herhangi birinin, alan adınız için geçerli bir sertifika düzenleyebilmesidir — kazara veya zorla. Kendi kök sertifikasına sahip bir kurumsal proxy'ye erişen bir saldırgan, tarayıcı uyarısı olmadan bir MITM saldırısı gerçekleştirebilir. SSL Pinning bu güvenlik açığını kapatır: bir CA sahte sertifika düzenlese bile, parmak izi kaydedilenle eşleşmediği için uygulama onu reddedecektir.

Mobil uygulamalarda SSL Pinning özellikle önemlidir çünkü cihazlar genellikle güvenli olmayan ağlarda çalışır — halka açık Wi-Fi, trafik incelemesi olan kurumsal proxy'ler, enfekte erişim noktaları. Verizon Mobile Security Index (2025)'e göre, mobil uygulamalardaki veri ihlallerinin %60'ından fazlası, taşıma katmanındaki trafik ele geçirmeyle ilgilidir.

Mobil Geliştirmede SSL Pinning Neden Gereklidir

Mobil uygulamalar hassas veriler iletir — kimlik doğrulama belirteçleri, ödeme bilgileri, kullanıcıların kişisel verileri. Ek koruma olmadan, HTTPS, cihazda kök sertifika değiştirme yoluyla tehlikeye atılabilir — örneğin, bir kurumsal profil veya kötü amaçlı uygulama yükledikten sonra. SSL Pinning, cihazda sahte bir kök CA kurulu olsa bile, uygulamanın kendi beyaz listesine karşı sertifikayı doğrulamaya devam etmesini sağlar.

SSL Pinning Nasıl Çalışır?

SSL Pinning süreci üç aşamadan oluşur: parmak izi yakalama, bağlantıda doğrulama ve hata işleme. Geliştirme sırasında, mühendis sunucu sertifikasının SHA-256 parmak izini alır (openssl x509 -fingerprint -sha256) ve bunu uygulama koduna veya yapılandırma dosyasına gömer. Her HTTPS isteğinde, uygulama alınan sertifikanın parmak izini hesaplar ve saklananla karşılaştırır — değerler eşleşmezse bağlantı sonlandırılır.

İlk aşama, derleme zamanında sabitlemedir: geliştirici sunucu sertifikalarını önceden bilir ve karmalarını gömer. İkinci aşama, ilk bağlantıda sabitlemedir (ilk kullanımda güven, TOFU): uygulama ilk istekte sertifikayı hatırlar ve sonraki tüm istekleri doğrulamak için kullanır. TOFU dinamik ortamlar için uygundur ancak ilk saldırıda savunmasızdır — ilk bağlantı zaten ele geçirilmişse, sahte sertifika güvenilir olarak kabul edilecektir.

Kritik bir detay yedek pinlerdir (backup pins). Sertifikaların bir son kullanma tarihi vardır ve değiştirildiklerinde, güncellenmemiş uygulama sunucuya bağlantısını kaybeder. Mühendisler 2–3 ek parmak izi ekler — örneğin, bir yedek sertifikanın parmak izi ve bir kök CA'nın parmak izi. Ana sertifika değişirse, uygulama yedek pinlere karşı doğrulama yapar ve bağlantı çalışmaya devam eder.

bash
# SHA-256 sertifika parmak izini alma
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

SSL Pinning Türleri

Sabitlemeyi uygulamak için iki ana yaklaşım vardır: tüm sertifikaya bağlama (certificate pinning) ve açık anahtara bağlama (public key pinning). Her yaklaşımın güvenlik ve bakım kolaylığını etkileyen kendi güçlü yönleri ve sınırlamaları vardır.

TürBağlama NesnesiEsneklikGüvenlik
Certificate PinningTüm X.509 sertifikasıDüşük — sertifika değiştiğinde güncelleme gerektirirYüksek — hassas bağlama
Public Key PinningSertifikanın açık anahtarıOrta — anahtar yeni bir sertifikada olabilirYüksek — sertifika ayrıntılarına daha az duyarlı
Hash PinningSertifika veya anahtarın SHA-256 karmasıYüksek — anahtarı değiştirmeden sertifikalar değiştirilebilirOrta — karma gücüne bağlıdır

Certificate Pinning

Sertifika sabitleme en katı yöntemdir. Uygulama, güvenilir sertifikanın veya SHA-256 parmak izinin bir kopyasını saklar ve her HTTPS bağlantısında sunucu sertifikasıyla karşılaştırır. Bu yöntem maksimum güvenlik sağlar ancak döndürme sırasında sorun yaratır — sertifikalar genellikle 1–2 yıl geçerlidir ve sonrasında zorunlu uygulama güncellemesi gerekir. Kontrollü güncelleme döngüsüne sahip kritik sistemler için önerilir.

Public Key Pinning

Açık anahtar sabitleme daha esnek bir yaklaşımdır. Uygulama, tüm sertifika yerine yalnızca sunucunun RSA veya ECDSA açık anahtarını hatırlar. Şirket aynı anahtar çiftini kullanıyorsa, sertifika yeniden düzenlendiğinde anahtar değişmeden kalabilir. Bu, uygulama güncellemelerinin sıklığını azaltır. Ancak, anahtar tehlikeye girerse, tüm istemcilerde kademeli bir değiştirme gerekli olacaktır.

iOS'ta SSL Pinning

Apple platformunda SSL Pinning, URLSession delegesi aracılığıyla uygulanır. Geliştirici, URLSessionDelegate protokolünü uygulayan bir sınıf oluşturur ve didReceive challenge yöntemini geçersiz kılar, burada saklanan parmak izlerine karşı sunucu sertifikasını manuel olarak doğrular. Alternatif bir yaklaşım, yapılandırmayı basitleştiren ServerTrustManager ile Alamofire kullanmaktır.

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)
        }
    }
}

Örnekte, delege URLSession'dan bir kimlik doğrulama isteği alır, challenge'dan serverTrust'ı çıkarır ve sertifikanın SHA-256 parmak izini saklananla karşılaştırır. Parmak izi eşleşirse — bağlantı devam eder, aksi halde challenge reddedilir. Üretim için, birden çok yedek pinin doğrulanması ve izleme için hata günlüğü eklenmesi önerilir.

iOS'ta Network Security Config

iOS 14'ten itibaren Apple, Info.plist aracılığıyla Certificate Pinning için yerleşik destek eklemiştir. Geliştirici, NSAppTransportSecurity anahtarında NSPinnedDomains alt sözlüğü ile güvenilir sertifikaları belirtir. Bu yaklaşım kod yazmayı gerektirmez ancak daha az esnektir — pinleri dinamik olarak değiştirmek veya doğrulama hatalarını günlüğe kaydetmek imkansızdır.

Android'de SSL Pinning

Android'de SSL Pinning'i uygulamanın üç ana yolu vardır: OkHttp kitaplığının CertificatePinner'ı aracılığıyla, XML'de Network Security Config aracılığıyla ve HttpsURLConnection'da özel doğrulama aracılığıyla. OkHttp, Retrofit ve diğer HTTP istemcilerinde kullanılan en popüler ve önerilen yaklaşımdır.

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

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

OkHttp yapılandırmasında, geliştirici alan adını ve bir veya daha fazla SHA-256 parmak izini belirtir. İlk parmak izinde, OkHttp sunucu sertifikasını belirtilen pinlerle karşılaştırır. Eşleşme yoksa, istemci SSLPeerUnverifiedException hatası fırlatır. Bir yedek pin zorunludur — onsuz, sertifika değiştiğinde API istekleri hemen başarısız olmaya başlayacaktır.

Android'de Network Security Configuration

Android, API 24'ten itibaren XML yapılandırması aracılığıyla bildirimsel Certificate Pinning'i destekler. res/xml/network_security_config.xml dosyası, alan adlarının ve parmak izlerinin bir listesini içerir. Bu yöntem statik yapılandırmalar için uygundur ancak anormalliklerin günlüğe kaydedilmesi ile TOFU veya özel doğrulama mantığı uygulanmasına izin vermez.

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>

SSL Pinning'in Avantajları ve Dezavantajları

SSL Pinning, mobil uygulamanın güvenliğini önemli ölçüde artırır ancak operasyonel karmaşıklıklar getirir. Ana avantaj, kök CA'lar tehlikeye girse bile MITM saldırılarına karşı korumadır. Uygulama, genel sertifika yetkililerinin tüm altyapısına değil, yalnızca geliştirici tarafından açıkça belirtilen sertifikalara güvenir. Bu, özellikle finansal uygulamalar, mesajlaşma uygulamaları ve hassas verilere sahip uygulamalar için kritiktir.

Ana dezavantaj, sertifika döndürmenin karmaşıklığıdır. Bir sertifikanın süresi dolarsa veya iptal edilirse, uygulamayı güncellemeyen kullanıcılar bağlantıyı kaybeder. Bu, yedek pinler ve kademeli güncelleme mekanizması ile çözülür: yeni uygulama hem eski hem de yeni sertifikaları bilir ve kullanıcıların tam güncellemesinden sonra eski pin koddan kaldırılır. En az 2 yedek pin eklenmesi önerilir — biri mevcut sertifika için, diğeri gelecek için.

Diğer bir ödünleşim, sabitlemeyi devre dışı bırakmadan trafik hata ayıklaması (Charles Proxy, Burp Suite) için genel proxy'leri kullanamamaktır. Bu, geliştirme sırasında ağ isteklerinin hata ayıklamasını zorlaştırır. Çözüm, koşullu derlemedir: hata ayıklama yapılarında sabitleme devre dışıdır, sürüm yapılarında etkindir. OWASP, geçiş için BuildConfig.DEBUG bayrağının kullanılmasını önerir.

YönAvantajDezavantaj
GüvenlikSahte CA'lar aracılığıyla MITM'den korumaAnahtar tehlikeye girdiğinde karmaşıklık
BakımAçık güven kontrolüDöndürme, uygulama güncellemesi gerektirir
Hata AyıklamaDoğru sunucuya bağlantı garantisiHata ayıklama proxy'lerini engeller

Sıkça Sorulan Sorular

SSL Pinning ile standart HTTPS doğrulaması arasındaki fark nedir?

Standart HTTPS doğrulaması, bilinen bir kök CA tarafından imzalanmış herhangi bir sertifikaya güvenir. SSL Pinning yalnızca belirli bir sertifikaya veya anahtara güvenir — bir CA sahte sertifika düzenlerse, uygulama onu reddeder.

Sabitlenmiş sertifikalar ne sıklıkta güncellenmelidir?

Sertifikalar genellikle 1–2 yıl geçerlidir. Mevcut sertifikanın süresi dolmadan 3–6 ay önce pinlerin güncellenmesi, yeni parmak izinin yedek pin olarak eklenmesi ve döndürmeden sonra eskisinin kaldırılması önerilir.

SSL Pinning bir CDN ile kullanılabilir mi?

Evet, ancak CDN'nin uç sunucular arasında geçiş yaparken sertifikaları değiştirebileceğini unutmayın. Belirli bir sertifika yerine açık anahtara sabitleme ve birden çok yedek pin kullanılması önerilir.

SSL Pinning doğrulama hatasında ne olur?

Bağlantı bir hatayla sonlandırılır — Android'de bu SSLPeerUnverifiedException'dır, iOS'te challenge .cancelAuthenticationChallenge ile reddedilir. Uygulama bu hatayı doğru şekilde işlemeli ve kullanıcıyı bilgilendirmelidir.

SSL Pinning tüm mobil uygulamalar için zorunlu mudur?

Hayır, ancak OWASP bunu hassas verilerle çalışan uygulamalar için önerir: bankacılık, sağlık, kurumsal sistemler. Basit salt okunur uygulamalar için, EV sertifikaları ile standart HTTPS doğrulaması genellikle yeterlidir.

Özet

  • SSL Pinning — uygulamayı belirli bir sunucu sertifikasına veya anahtara bağlayarak CA güven zincirine bağımlılığı ortadan kaldırma
  • İki ana tür — certificate pinning (katı, sertifikaya bağlı) ve public key pinning (esnek, anahtara bağlı)
  • Yedek pinler — zorunlu bir öğe: sorunsuz sertifika döndürme için en az 2 yedek parmak izi
  • iOS — manuel serverTrust doğrulaması ile URLSessionDelegate veya Alamofire ServerTrustManager aracılığıyla uygulama
  • Android — OkHttp CertificatePinner (programatik) veya Network Security Config (XML aracılığıyla bildirimsel)
  • Risk — sabitlenmiş sertifikaların yanlış döndürülmesiyle, kullanıcılar uygulama güncellenene kadar bağlantıyı kaybeder
  • Öneri — finansal, tıbbi veya kurumsal verilere sahip uygulamalar için SSL Pinning kullanın

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun