Certificate Pinning, bir mobil uygulamanın CA zincirindeki herhangi bir sertifikaya güvenmek yerine, sunucu sertifikasının önceden bilinen bir örnekle eşleşip eşleşmediğini doğruladığı bir güvenlik tekniğidir. Yüzlerce sertifika yetkilisine dayanan normal TLS doğrulamasının aksine, pinning güveni tek bir belirli sertifikaya veya onun açık anahtarına daraltır. OWASP Mobil Güvenlik Test Kılavuzu'na (2024) göre, Certificate Pinning uygulanması, sertifika değiştirme ile ilgili Man-in-the-Middle saldırı senaryolarının %100'ünü engeller. OWASP MSTG, 2024
Önemli çıkarımlar
Certificate Pinning, uygulamanın sunucu sertifikasının bir örneğini sakladığı (veya “sabitlediği”) ve her bağlantıda alınan sertifikayı bu örnekle karşılaştırdığı bir güvenlik mekanizmasıdır. Sertifika eşleşmezse — resmi olarak güvenilir bir sertifika yetkilisi tarafından imzalanmış olsa bile — bağlantı sonlandırılır. Bu, bir saldırganın tehlikeye atılmış bir CA aracılığıyla sahte bir sertifika elde ettiği saldırılara (2011'de DigiNotar veya 2011'de Comodo'da olduğu gibi) karşı korur.
Pinning süreci üç aşamadan oluşur: güvenilir bir örnekten sertifika veya açık anahtarın parmak izinin (fingerprint) çıkarılması; bu parmak izinin uygulama kodunda veya kaynaklarında saklanması; TLS el sıkışması sırasında karşılaştırma. Geliştirici, tüm sertifikanın SHA-256 parmak izini veya yalnızca açık anahtarı (Public Key Pinning) sabitleyebilir. İkinci yaklaşım tercih edilir: sertifika yenilendiğinde, açık anahtar genellikle aynı kalır ve uygulama sunucuyla bağlantısını kaybetmez. OWASP tavsiyelerine göre minimum pin sayısı 2'dir: biri mevcut ve biri anahtar döndürme için yedek. OkHttp ve TrustKit gibi modern kütüphaneler, geliştiricinin ek çabası olmadan her TLS bağlantısında belirtilen pinlerin doğrulama sürecini otomatikleştirir. Pinning'in standart TLS doğrulamasının yerini almadığını, onu tamamladığını anlamak önemlidir: önce sertifika zinciri doğrulaması ile normal bir el sıkışma gerçekleştirilir, ardından ek bir pinning kontrolü yapılır. Bu iki seviyeli koruma, hatalı sertifika verme ve sertifika yetkilisi altyapısına yönelik saldırılar dahil olmak üzere CA güvenliğinin ihlaliyle ilgili güvenlik açıklarını ortadan kaldırır.
Certificate Pinning uygulamak için her biri kendi depolama ve doğrulama özelliklerine sahip birkaç yaklaşım vardır. Yöntem seçimi, uygulama mimarisine, sertifika güncelleme sıklığına ve esneklik gereksinimlerine bağlıdır.
| Pinning türü | Ne depolanır | Esneklik | Kullanım örneği |
|---|---|---|---|
| Certificate Pinning | Tam X.509 sertifikası | Düşük | 1–2 yıl sabit sertifika |
| Public Key Pinning | Açık anahtar (SPKI) | Orta | OWASP önerilen yaklaşım |
| Hash Pinning | SHA-256 parmak izi | Orta | OkHttp'de popüler (certificatePinner) |
| CA Pinning | Ara CA | Yüksek | Kurumsal uygulamalar |
En dengeli yöntem, OWASP ve Google tarafından önerilen Public Key Pinning'dir. Belirli bir sertifika (her 1–2 yılda bir değişen) yerine, uygulama SubjectPublicKeyInfo parmak izini — açık anahtarın bir soyutlamasını — depolar. Sertifika aynı anahtarla yenilenirse (anahtar yeniden kullanımı), pin geçerliliğini korur. Anahtar değişirse — geliştirici önceden uygulama güncellemesine bir yedek pin ekler. Mobil projelerde minimum/maksimum pin stratejisi kullanılır: yedek dahil minimum 2 pin ve şişkinliği ve artan doğrulama süresini önlemek için maksimum 4 pin.
Belirli pinning türünün seçimi, uygulama mimarisine ve gereksinimlerine bağlıdır. Tek bir alan adı üzerinden REST API ile çalışan genel mobil uygulamalar için OkHttp veya TrustKit aracılığıyla iki pinli Public Key Pinning idealdir. Kendi sertifika yetkilisine sahip kurumsal uygulamalar için CA Pinning uygundur — güven nihai sertifikaya değil, CA'ya bağlı olduğundan, istemci sertifikaları değiştiğinde güncelleme gerektirmez. IoT ve gömülü sistemler için tam sertifika sabitlemeli Certificate Pinning önerilir: cihazlar nadiren güncellenir, bu nedenle tüm güven zinciri üzerinde kontrol kritiktir. Pin son kullanma tarihlerinin izlenmesi zorunlu bir uygulamadır: mevcut sertifika geçersiz hale gelmeden önce yeni pinlerle bir uygulama güncellemesi yayınlamak için sertifikanın sona ermesinden 30, 14 ve 7 gün önce uyarılar ayarlayın. Yeni pinlerle güncelleme yayınlamayı otomatikleştirmek için, uygulama mağazasında yeni bir sürüm yayınlamadan pin listesini dinamik olarak güncellemeye izin veren Firebase Remote Config veya özel bir yapılandırma API'si kullanılması önerilir.
Certificate Pinning, mobil uygulama güvenliğini önemli ölçüde artırır ancak geliştirme ekibine operasyonel bir yük getirir. Yanlış uygulama nedeniyle bağlantı engelleme risklerine karşı güvenlik faydalarını tartmak önemlidir.
Ana avantaj, CA güvenliğinin ihlali durumları dahil olmak üzere Man-in-the-Middle saldırılarına karşı korumadır. Pinning, bir saldırgan tarafından yayınlanan sahte sertifikaları işe yaramaz hale getirir: bir CA sahteciliği imzalamış olsa bile, uygulama onu reddedecektir. Ek bir fayda, trafik incelemesi için sertifikaları değiştiren kurumsal proxy sunucularına karşı korumadır. Google Security Blog'a (2023) göre, pinning kullanan uygulamaların, yalnızca standart TLS doğrulaması kullanan uygulamalara kıyasla trafik ele geçirme yoluyla tehlikeye atılma olasılığı %86 daha düşüktür.
Pinning'in ana dezavantajı, kendini engelleme riskidir: uygulama güncellemesi yayınlanmadan önce sunucu sertifikası değişirse (yenileme, sağlayıcı değişikliği, anahtar döndürme), kullanıcılar sunucuya erişimi kaybeder. Ek dezavantajlar: hata ayıklama karmaşıklığı (her yapılandırma değişikliği pin güncellemeleri gerektirir), TrustKit kullanırken APK boyutunda 5–15 KB artış ve yeni bir sürüm olmadan değişiklikleri hızlı bir şekilde geri alamama. Riskleri en aza indirmek için yedek pinler, her 2–3 ayda bir otomatik döndürme ve uygulamanın hem eski hem de yeni sertifikayı kabul ettiği bir ödemesiz dönem kullanılır. Pinning etkinken geliştirme sırasında, ağ isteklerinde hata ayıklamak için proxy araçlarının (Burp Suite, Charles) kullanılamayacağını da dikkate almak önemlidir — geliştirme yapıları için, pinning BuildConfig.DEBUG bayrağı aracılığıyla devre dışı bırakılmalı ve QA testi, koruma etkinken yayın imzası üzerinde yapılmalıdır. Bazı ekipler, geliştirme sırasında bile korumayı sürdürmek için geliştirme ortamı için ayrı bir pinning sertifikasına sahip bir hazırlık alan adı kullanır.
OkHttp — ağ istekleri için standart kütüphane — kullanarak Android'de Certificate Pinning uygulamasına bir örnek bakalım. OkHttp, açık anahtarların SHA-256 hash'lerini kabul eden yerleşik bir CertificatePinner sağlar.
val certificatePinner = CertificatePinner.Builder()
.add(
"api.example.com",
"sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
)
.add(
"api.example.com",
"sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB="
)
.build()
val client = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build()
Yukarıdaki kodda, api.example.com alan adı için iki pin ekliyoruz: birincil (mevcut sertifika) ve bir yedek pin (döndürme için). OkHttp, sunucu sertifikasının belirtilen SHA-256 parmak izlerinden biriyle eşleşip eşleşmediğini otomatik olarak doğrular. Sertifikanın SHA-256 parmak izini almak için şu komutu kullanın: openssl s_client -connect api.example.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64. Parmak izlerini kodda düz metin olarak değil, şifrelenmiş veya karartılmış olarak saklamak önemlidir: MobSF statik analizi, DEX dosyalarında ham SHA-256 dizelerini kolayca bulur. Pinlerin res/raw kaynaklarında AES ile şifrelenmiş olarak saklanması ve yerel kod (NDK/JNI) aracılığıyla uygulama başlangıcında çözülmesi önerilir.
iOS'te, Certificate Pinning için birincil araç açık kaynaklı TrustKit kütüphanesidir. OkHttp'nin aksine, TrustKit Info.plist aracılığıyla bildirimsel olarak yapılandırılır ve uygulamayı yeniden derlemeden pin değişikliklerine izin verir. Yapılandırma, alan adlarına sahip bir sözlük ve SHA-256 açık anahtar parmak izleri dizisi içerir. TrustKit, NSURLSession isteklerini otomatik olarak engeller ve veri iletimi başlamadan önce sertifikaları doğrular. TrustKit'in kritik bir özelliği, pin doğrulama raporları desteğidir: kütüphane, pin uyuşmazlığı durumunda belirtilen bir uç noktaya rapor gönderebilir ve sertifika anormalliklerine hızlı yanıt verilmesini sağlar. Apple, iOS 14'ten itibaren Info.plist'te yerel bir NSPinnedDomains mekanizması da sağlar, ancak TrustKit daha esnek yapılandırma, rapor desteği ve işletim sistemi güncellemesi olmadan pinleri sıcak değiştirme yeteneği nedeniyle tercih edilen seçim olmaya devam etmektedir. TrustKit'in didReceiveChallenge delegesi aracılığıyla URLSession ile entegre olduğunu ve başarılı pin doğrulamasında .performDefaultHandling, uyuşmazlık durumunda .cancelAuthenticationChallenge döndürdüğünü belirtmek önemlidir. Pin doğrulama raporlarını izlemek için, hata sıklığını analiz eden ayrı bir uç nokta yapılandırılması önerilir: rapor sayısı keskin bir şekilde artarsa — bu, bir MitM saldırısına veya acil pin güncellemesi gerektiren yakın bir sertifika sona ermesine işaret ediyor olabilir.
Sıkça sorulan sorular
Certificate Pinning, telefonunuzda bir arkadaşınızın parmak izini kaydetmek gibidir: “doğru” sunucu sertifikasının neye benzediğini hatırlarsınız ve birisi “resmi” bir makamdan kimlik gösterse bile başka kimseye güvenmezsiniz.
Normal HTTPS, yüzlerce yetkili arasından herhangi bir CA tarafından imzalanmış herhangi bir sertifikaya güvenir. Certificate Pinning üstüne bir kontrol ekler: sertifika yalnızca geçerli olmakla kalmamalı, özellikle uygulama koduna sabitlenmiş olan sertifika olmalıdır.
2–3 pin saklanması önerilir: mevcut pin ve yeni sertifika için bir yedek pin. Sertifika değişikliğinden 1–2 ay önce, gelecekteki sertifikanın pini eklenmiş olarak uygulamanın yeni bir sürümünü yayınlayın. Değişiklikten sonra, eski pin bir sonraki sürümde kaldırılır.
Evet, kullanılabilir. Pinning, Let's Encrypt dahil tüm sertifikalarla çalışır. Ücretsiz sertifikaların kısa bir geçerlilik süresine (3 ay) sahip olduğunu hatırlamak önemlidir, bu nedenle yedek pin stratejisi ve otomatik döndürme zorunlu hale gelir.
Pinning'i test etmek için Burp Suite veya mitmproxy kullanın. Pinning ile uygulama doğru yapılandırılmışsa, proxy aracı trafiği engelleyemez — bağlantı el sıkışma aşamasında sonlandırılır. Entegrasyon testleri için OkHttp'nin MockWebServer'ını kullanın.
Özet
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.
Ayrıca okuyun