Sprint Hikayeleri #2 (Mobile SSL Pinning)

Fatih Duygu
Mobiroller Tech
Published in
4 min readApr 21, 2020

Herkese merhabalar 🙋‍♂

Sprint hikayeleri serisinin 2. makalesi ile karşınızdayız. Bir önceki makaleyi henüz okumadıysanız bu linkten ulaşabilirsiniz.

Bu yazıyı birlikte hazırladığım Furkan Kaplan ile, mobil uygulamalarda güvenli iletişim için kullanılan ve bizim de Mobiroller bünyesinde ihtiyaç duyduğumuz SSL Pinning konusundaki deneyimlerimizi paylaşmak istedik.

Hazırsanız hiç uzatmadan başlıyoruz.

Peki Nedir Bu SSL Denen Şey :)

Günümüzde çoğunlukla birçok verimizi elektronik ortamda saklamaktayız. Bu durumda bu özel verilerin güvenliği kullanıcılar ve biz geliştiriciler için en önemli konulardan birisidir. Bu sakladığımız verilerin güvenli bir şekilde istemci-sunucu arasındaki iletişimini sağlamak için SSL kullanırız.

SSL, kriptoloji algoritmalarını kullanarak istemci sunucu arasındaki veri alışverişinin güvenli bir şekilde gerçekleşmesini sağlayan bir güvenlik protokolüdür.

Veri iletimini sağlarken, uygulama içerisindeki sertifika ile uzak sunucudaki sertifikanın karşılaştırılıp doğruluğunun onaylanması gerekmektedir. Bu doğrulama yöntemi SSL Pinning olarak adlandırılmaktadır.

Ya Kullanmazsak Bu SSL Pinning’i?

Mobil uygulamalarda SSL Pinning kullanılmadığı durumlarda Man-in-the-middle attack (Ortadaki Adam Saldırısı) olarak adlandırılan bir güvenlik zafiyetine imkan sağlanmış olur.

Saldırgan, birbirleri ile doğrudan iletişim kuran istemci-sunucu arasındaki trafiğe girip veri paketlerini inceleyebilir hatta manipüle edebilir.

SSL Pinning nasıl kullanılır?

Biz SSL Pinning uygulamadığımız projede iOS tarafında Alomafire kütüphanesi kullanırken Android tarafında ise OkHttp kütüphanesini kullandık. Gelin her iki platformda da SSL Pinning’i nasıl kullanacağımızı hep birlikte inceleyelim.

Android için SSL Pinning

Öncelikle Android’de SSL Pinning’i kullanmak için uzak sunucu sertificasına ait public key’e ihtiyacımız vardır. Sunucunun sertifikasının public key’ine erişmek için SSL Labs’ın sunduğu online tool’u kullanabilirsiniz. Bu tool ile domain adresini aratarak hem sertifika bilgilerine erişebilir, hem de public key’e ulaşabilirsiniz.

NetworkManager.java

//This method added for blocking ssl pinning bypass
//Can not be open with different ssl public keys in this app
CertificatePinner certificatePinner = new CertificatePinner.Builder()
.add("example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAA=")
.add("example.com","sha256/BBBBBBBBBBBBBBBBBBBBBBBB=")
.build();
clientBuilder = new OkHttpClient.Builder()
.connectTimeout(RESPONSE_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(RESPONSE_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(RESPONSE_TIMEOUT, TimeUnit.SECONDS)
.protocols(Collections.singletonList(Protocol.HTTP_1_1))
.certificatePinner(certificatePinner);
client = clientBuilder.build();

OkHttp kullanarak uygulamanıza CertifacatePinner Builder ile birden fazla sertifika ekleyebilirsiniz.

IOS için SSL Pinning

IOS platformunda Alomafire kütüphanesinde SSL Pinning kullanmak için Android’deki OkHttp’den farklı olarak SSL sertifikası uygulamanın ana dizinine gömülmesi gerekmektedir.

İndirdiğimiz SSL sertifikasını iOS uygulamamızın ana dizinine ekledikten sonra aşağıda şekilde implemente edebiliriz.

PinningNetworkManager.swift

import Foundation
import Alamofire
class PiningNetworkManager {var manager:SessionManager?init() {
let serverTrustPolicies: [String:
ServerTrustPolicy] = [
PepUrlStr.protocolRelativeBaseURL: .pinCertificates(
certificates:ServerTrustPolicy.certificates(),
validateCertificateChain:true,
validateHost:true
)
]
manager = SessionManager(
serverTrustPolicyManager:ServerTrustPolicyManager(policies:
serverTrustPolicies)
)
}
}
class APIPinning {static let piningNetworkManager = PiningNetworkManager()public static func getManager() -> SessionManager {
return piningNetworkManager.manager !
}
}

NetworkManager.swift

APIPinning.getManager().request(method
,method: HTTPMethod.post
,parameters: dictParams
,encoding: JSONEncoding.default
,headers: getHeader()).validate(statusCode:200..<404)
.responseJSON{(response) in ...

Peki ya sonra …

SSL Sertifikaları doğası gereği güvenlik nedeniyle sürekli olarak yenilenmek zorundadır. Eğer sunucu tarafında SSL sertifikaları yenilendiğinde uygulama içerisinde kullandığımız expire olan SSL sertifikasını güncellemez isek client ile server bağlantısı doğrulanamayacağı için haberleşme gerçekleşmeyecektir. Bu sorunun ortaya çıkması durumunda uygulamaların güncellenip markete yayına gönderilmesi ve onay alması belirli bir zaman alacaktır. Bu durum hem şirketler hem de kullanıcılar nezdinde istenmeyen bir durumdur ve bazen büyük şirketler bile bu durumda karşılaşmaktadır.

Bu durumla karşılaşmamak için sertifika sağlayıcı şirketler, sertifikanın geçersiz kılınmasına son 90 gün kala, belirli aralıklarla son kullanma bildirimleri gönderir. Bu bildirimlerin tek bir kişi yerine, bir dağıtım listesine gönderilerek gözden kaçma ihtimalinin önüne geçilmesi sağlanmalıdır.

SSL sertifikası expire olmadan önce, yukarıda belirtildiği gibi son kullanma bildirimleri gelmeye başladığında, eski sertifika geçersiz kılınmadan ikinci yeni bir SSL sertifikasının alınması gerekmektedir. Alınan sertifika iOS ve Android’de kendine özgü yolları ile eklenmeli ve güncelleme çıkılmalıdır.

Eski sertifikanın expire olmasına yakın uygulamada version force yöntemi kullanarak, kullanıcıların yeni versiyonu kullanmaları sağlanmalıdır. Version force işlemi yapıldıktan sonraki ileri bir tarihte, güncelleme çıkılması durumunda client tarafındaki expire olmuş sertifika kaldırılmalıdır.

Bu yol izlenerek uygulamanın kesintiye uğramaması ve kullanıcının uygulamayı sorunsuz bir şekilde kullanması sağlanmalıdır.

Bir sonraki sprint’te farklı hikayelerle görüşmek dileğiyle, hepiniz #EvdeKal’ın

--

--