SSL Pinning - Man In The Middle Saldırısı


SSL Pinning

SSL, istemci ve sunucu arasında şifreli bir bağlantı oluşturmak için kullanılan bir protokol olan Güvenli Yuva Katmanı (Secure Socket Layer) anlamına gelir. Ağdaki tüm verilerin geçişinin özel ve ayrılmaz olmasını sağlar.

SSL nasıl çalışır? İstemci sunucuyla bağlantı kurduğunda (SSL handshake):


  1. İstemci sunucuya bağlanır ve sunucu kendisini tanımlamasını ister. 
  2. Sunucu istemciye sertifika gönderir (ortak anahtar içerir Public Key)
  3. Client bu sertifikanın geçerli olup olmadığını kontrol eder. Varsa, istemci bir simetrik anahtar (oturum anahtarı - Session Key) oluşturur, ortak anahtarla şifreyi sunucuya geri gönderir.
  4. Sunucu şifreli simetrik anahtarı alır, kendi özel şifresi ile şifresini çözer, sonra müşteriye onay paketi gönderir.
  5. Müşteri ACK'yi alır ve oturumu başlatır
SSL kullanarak, istemci yalnızca geçerli sertifikaya sahip güvenilir kaynaklardan bağlantıya izin verecektir.
Sorunumuz client ile sunucu arasında sunucu gibi davranan bir saldırganın varlığı olduğunda başlamaktadır. Client'ımız C, server'ımız S ve saldırganımız (Attacker) A olsun.
Adım 1, paketin S'ye gönderilmesi yerine A, paketi yakalayabilir ve S şeklinde davranabilir. S'den sertifika almak yerine, C müşterisi A'dan sahte sertifika alır ve geçerli olduğuna inanır.C, S ile iletişim kurduğunu düşünebilir, ancak aslında tüm bağlantı akışları saldırgan A'ya yönlendirilir.
Bu nedenle, SSL sabitleme, Man-In-The-Middle (MITM) saldırısını önlemek için bir çözüm olabilir. 
SSL sabitleme, istemcinin belirlenen sunucuyla bağlantı kurmasını sağlar. SSL'nin bu sunucu sertifikasını sabitleyen ana anahtarı uygulama paketine kaydedilir. Ardından, istemci sunucudan sertifika aldığında, daha sonra bağlantı kurulmadan önce aynı olduklarından emin olmak için 2 sertifikayı karşılaştırır.
Şimdi, iOS'ta SSL sabitlemenin nasıl uygulanacağını göstereceğim.

1. NSURLSession

NSURLSession için, SSL sabitlemeyi işlemek için ana yöntem URLSession: didReceiveChallenge: completionHandler: delege. Sınıfınızı URLSessionDelegate ile uyumlu olacak şekilde ayarlayın ve bu işlevi sınıfınıza yapıştırın:





Bu işlev “uzak sunucudan bir kimlik doğrulama isteğine yanıt olarak delege kimlik bilgilerini talep edecektir.”Sertifikayı, uygulama paketinden kaydedilen sunucuyla karşılaştırırız. 2 sertifika aynıysa, kimlik doğrulaması geçmesine izin verir ve istemci sunucuya bağlanabilir.

2. Alamofire

Alamofire, Swift'de HTTP ağ iletişimi için en popüler kütüphane olabilir. SSL sabitleme için yerleşik işlevi vardır ve kullanımı çok kolaydır.



SSL sabitlemenin bir dezavantajı, sertifikayı uygulamada kaydetmeniz gerektiğidir. Sertifika güncellendiğinde, uygulamanın yeni sürümünü yayınlamamız gerekir. Ama bu aynı zamanda başka bir soruna da yol açıyor: Eski versiyonla ne yapıyoruz?

  1. Tüm kullanıcıların yeni sürümü indirdiğinden emin oluncaya kadar eski sertifikayı bir süre koruyun. 
  2. Yeni sertifika indirmek için özel bir akış. Peki ya bu akıntı saldırıya uğrarsa?