Android’de Veri Güvenliği için SSL Certificate Pinning

Cemalettin Pulat
Asis Technologies
Published in
3 min readSep 19, 2021

Mobil uygulamalarda kullandığımız hassas verileri korumak artık çok önemli bir hale geldi. Bu verileri gönderirken ve alırken, kullanıcılar ve geliştiriciler tarafından uçtan uca bir güvenlik beklenir.

Şu anda istemci-sunucu arasındaki iletişim için yaygın olarak HTTP protokolu kullanılmaktadır. Bu iletişimi güvenli hale getirip, ağ trafiğini şifrelemek için HTTP protokolüne SSL sertifikası eklenir. Yani HTTPS kullanılır .

Peki Sorun Ne ?

HTTPS protokolünü kullanarak bir SSL bağlantısı kurarken, sunucudaki sertifika Android tarafından doğrulanır. Ancak verilen sertifikanın tam olarak sunucunuzun kullandığı sertifika olup olmadığını kontrol etmez ve sunucu tarafından verilen her sertifikaya güvenir. Bu, ağ trafiğini dinlemek isteyen birinin kendi sahte sertifikalarını oluşturabileceği anlamına gelir. Bu sertifikalar ile daha sonra şifreli SSL bağlantısını engellemesine izin verecektir. Bu tarz bir saldırıya Man-In-The-Middle adı verilir.

MITM https://docs.wavemaker.com/learn/assets/blog_certificate_pinning/mitmdiagram.png
https://docs.wavemaker.com/learn/assets/blog_certificate_pinning/mitmdiagram.png

Bu saldırıyı önlemek için ne yapmalıyız?

Bu tarz bir saldırıyı engellemek için Certificate Pinning uygulanmalıdır. Uygulamanın yalnızca önceden tanımlanmış sertifikaya veya parmak izine güvenmesine dayanan bir yöntemdir. Uygulama, sunucuyla bağlantı kurarken, sertifikanın hash değerini(Android tarafından pin olarakta adlandırılır) sunucudan alınan bir sertifikayla karşılaştırmaktadır. Pinler aynı ise, bağlantı geçerlidir ve veri aktarımı devam edebilir. Pinler aynı değilse, uygulama güvenliği ihlal edildiği için bağlantıyı reddeder.

Certificate Pinning için yaygın olarak kullanılan iki farklı yol vardır.

1 - OkHttp ve Certificate Pinner

OkHttp, Square şirketi tarafından geliştirilen bir HTTP istemcisidir.

Sağladığı kolaylıklar ve özellikleri için OkHttp üzerinden Retrofit kullanılmaktadır.

Certificate Pinning için öncelikle sunucuda kullandığımız sertifikaya ait hash değerlerine(sha256) sahip olmamız lazım. Bunun için SSL Labs sitesi kullanılabilir. Herhangi bir uzak sunucu sertifikası bilgilerine ve hash değerlerine(sha256) ulaşabilirsiniz.

Aşağıda, OkHttpClient ile bu değerlerin nasıl eklendiği gösterilmektedir.

Farklı etki alanları için birden fazla hash değeri ekleyebilirsiniz. Birden fazla hash değeri(sha256), uygulamanızı daha esnek hale getirecektir.

Her sertifikanın belli bir süresi vardır. Eski sertifikaların süreleri yakında bitecekse CertificatePinner ile ek sertifikalar ekleyebilirsiniz.

2 - Ağ Güvenliği Yapılandırması

Android platformu Certificate Pinning için biz geliştiricilere daha yeni ve kolay bir yol sunuyor. XML dosyalarını kullanarak Android Certificate Pinning de dahil olmak üzere, uygulamanıza güvenli iletişim yöntemlerini tanımlayabilirsiniz.

Ancak bu yöntemin sadece Android N ve üzeri sürümlerde desteklendiğini unutmamak lazım.

Şimdi bu yöntemi uygulamamıza ekleyelim

Ağ yapılandırma xml dosyasını oluşturuyoruz:

res/xml/network_security_config.xml

Manifest dosyasının içerisinde application tag leri arasına networkSecurityConfig olarak tanımlıyoruz:

<?xml version=”1.0" encoding=”utf-8"?>
<manifest
xmlns:android=”http://schemas.android.com/apk/res/android"package=”com.pulat.example”><applicationandroid:networkSecurityConfig=”@xml/network_security_config”></application>
</manifest

Yapılandırma dosyasını aşağıdaki gibi ayarlayıp hash değerlerini tanımlıyoruz:

<?xml version=”1.0" encoding=”utf-8"?>
<network-security-config>
<domain-config><domain includeSubdomains=”true”>www.example.com</domain><pin-set><pin digest=”SHA-256">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</pin><pin digest=”SHA-256">BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=</pin> //backup pin</pin-set></domain-config>
</network-security-config>

Görüldüğü üzere bu yöntemin uygulanması son derece kolaydır.

Önemli Not: Eski sertifikanın süresinin dolmasına yakın uygulamada force update yöntemi kullanarak, uygulamanın güncellenmesi sağlanmalıdır.Böylelikle kullanıcıların uygulamayı sorunsuz bir şekilde kullanması sağlanacaktır. Aksi takdirde istemci-sunucu bağlantısı doğrulanmayacağı için kullanıcı uygulamayı kullanamayacaktır.

Özet

Certificate pinning için en yaygın kullanılan iki yöntemi açıkladım. OkHttp ve CertificatePinner yöntemi tüm Android API sürümlerini desteklerken, Ağ Güvenliği Yapılandırması yöntemi Android N ve üzeri sürümleri destekler. Hangi yöntemi kullanacağımız önemli değil ama güvenli ağ oluşturmanın tek yolu şu anlık budur.

Bu nedenle OWASP Mobile , Man-In-The-Middle saldırıları için en etkili koruma yöntemi olarak Certificate Pinning önerir.

Kaynaklar:

https://developer.android.com/training/articles/security-config#CertificatePinning

--

--