SSL Pinning — xavfsizlik texnikasi bo'lib, unda ilova server sertifikatini oldindan ma'lum bo'lgan iz yoki sertifikat asosida tekshiradi, CA ishonch zanjiriga tayanish o'rniga. Standart tekshiruvdan farqli o'laroq, pinning soxta ildiz sertifikat markazlari orqali trafikni tutib olishning oldini oladi. OWASP Mobile Security Testing Guide (2025) ma'lumotlariga ko'ra, bu texnika MITM hujumlaridan himoyalanish uchun top-3 tavsiya etilgan nazorat ro'yxatiga kiradi. Pinningsiz, hujumchi soxta ildiz sertifikat bilan ilovaning barcha HTTPS trafigini shifrni ochishi mumkin.
Asosiy fikrlar
SSL Pinning — xavfsizlik mexanizmi bo'lib, unda mobil yoki veb ilova ishonchli sertifikatni yoki serverning ochiq kalitini eslab qoladi va sertifikati saqlanganga mos kelmaydigan har qanday ulanishni rad etadi. Standart HTTPS sxemasida mijoz sertifikatni ildiz CA'gacha bo'lgan ishonch zanjiri orqali tekshiradi — har qanday CA har qanday domen uchun sertifikat imzolashi mumkin. SSL Pinning bu zaif nuqtani bartaraf qiladi: yuzlab CA'larga ishonish o'rniga, ilova faqat bitta muayyan sertifikatga ishonadi.
Standart tekshiruvning muammosi shundaki, yuzlab ildiz CA'lardan har biri sizning domeningiz uchun haqiqiy sertifikat berishi mumkin — tasodifan yoki majburlik ostida. O'zining ildiz sertifikatiga ega korporativ proksiga kirish olgan hujumchi, brauzer ogohlantirishisiz MITM hujumini amalga oshirishi mumkin. SSL Pinning bu bo'shliqni yopadi: CA soxta sertifikat bersa ham, ilova uni rad etadi, chunki iz qayd etilganiga mos kelmaydi.
Mobil ilovalarda SSL Pinning ayniqsa muhim, chunki qurilmalar ko'pincha himoyalanmagan tarmoqlarda ishlaydi — jamoat Wi-Fi, trafik tekshiruvi bo'lgan korporativ proksilar, zararlangan kirish nuqtalari. Verizon Mobile Security Index (2025) ma'lumotlariga ko'ra, mobil ilovalardagi ma'lumot sizmalarining 60% dan ortig'i transport darajasida trafikni tutib olish bilan bog'liq.
Mobil ilovalar nozik ma'lumotlarni uzatadi — autentifikatsiya tokenlari, to'lov ma'lumotlari, foydalanuvchilarning shaxsiy ma'lumotlari. Qo'shimcha himoyasiz HTTPS qurilmada ildiz sertifikatini almashtirish orqali buzilishi mumkin — masalan, korporativ profil yoki zararli ilova o'rnatilgandan so'ng. SSL Pinning kafolatlaydiki, qurilmada soxta ildiz CA o'rnatilgan bo'lsa ham, ilova sertifikatni o'zining oq ro'yxati bo'yicha tekshirishda davom etadi.
SSL Pinning jarayoni uch bosqichdan iborat: izni olish, ulanish vaqtida tekshirish va xatoni boshqarish. Ishlanma bosqichida muhandis server sertifikatining SHA-256 izini oladi (openssl x509 -fingerprint -sha256) va uni ilova kodiga yoki konfiguratsiya fayliga joylashtiradi. Har bir HTTPS so'rovida ilova olingan sertifikatning izini hisoblab chiqadi va uni saqlangan bilan taqqoslaydi — qiymatlar mos kelmasa, ulanish uziladi.
Birinchi bosqich — qurish bosqichida pinning: dasturchi server sertifikatlarini oldindan biladi va ularning xeshlarini joylashtiradi. Ikkinchi bosqich — birinchi ulanishda pinning (trust on first use, TOFU): ilova birinchi so'rovda sertifikatni eslab qoladi va keyingi barcha so'rovlarni tekshirish uchun ishlatadi. TOFU dinamik muhitlar uchun qulay, lekin birinchi hujumda zaif — agar birinchi ulanish allaqachon tutib olingan bo'lsa, soxta sertifikat ishonchli deb qabul qilinadi.
Muhim detal — zaxira izlar (backup pins). Sertifikatlarning amal qilish muddati bor va ular almashtirilganda, yangilanmagan ilova server bilan aloqani yo'qotadi. Muhandislar 2–3 qo'shimcha iz qo'shadilar — masalan, zaxira sertifikatning izi va ildiz CA ning izi. Asosiy sertifikat o'zgarsa, ilova backup pins bo'yicha tekshiradi va ulanish ishlashda davom etadi.
# Sertifikatning SHA-256 izini olish
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
Pinningni amalga oshirishning ikkita asosiy yondashuvi mavjud: butun sertifikatga bog'lash (certificate pinning) va ochiq kalitga bog'lash (public key pinning). Har bir yondashuvning xavfsizlik va xizmat ko'rsatish qulayligiga ta'sir qiluvchi kuchli tomonlari va cheklovlari bor.
| Tur | Fiksatsiya obyekti | Moslashuvchanlik | Xavfsizlik |
|---|---|---|---|
| Certificate Pinning | Butun X.509 sertifikati | Past — sertifikat o'zgarganda yangilash talab qilinadi | Yuqori — aniq bog'lash |
| Public Key Pinning | Sertifikatning ochiq kaliti | O'rta — kalit yangi sertifikatda bo'lishi mumkin | Yuqori — sertifikat detallariga kamroq sezgir |
| Hash Pinning | Sertifikat yoki kalitning SHA-256 xeshi | Yuqori — kalitni o'zgartirmasdan sertifikatlarni almashtirish mumkin | O'rta — xeshning mustahkamligiga bog'liq |
Sertifikatga bog'lash — eng qattiq usul. Ilova ishonchli sertifikatning nusxasini yoki uning SHA-256 izini saqlaydi va har bir HTTPS ulanishida server sertifikati bilan taqqoslaydi. Bu usul maksimal xavfsizlikni ta'minlaydi, lekin rotatsiyada muammolar yaratadi — sertifikatlar odatda 1–2 yil amal qiladi, shundan so'ng ilovani majburiy yangilash talab qilinadi. Nazorat qilinadigan yangilash sikli bo'lgan muhim tizimlar uchun tavsiya etiladi.
Ochiq kalitni fiksatsiya qilish — yanada moslashuvchan yondashuv. Butun sertifikat o'rniga ilova faqat serverning RSA yoki ECDSA ochiq kalitini eslab qoladi. Kalit, agar kompaniya bir xil kalit juftligidan foydalansa, sertifikat qayta berilganda o'zgarishsiz qolishi mumkin. Bu ilova yangilanishlari chastotasini kamaytiradi. Biroq, agar kalit buzilgan bo'lsa, barcha mijozlarda kaskadli almashtirish talab qilinadi.
Apple platformasida SSL Pinning URLSession delegati orqali amalga oshiriladi. Dasturchi URLSessionDelegate protokolini amalga oshiruvchi sinf yaratadi va didReceive challenge metodini bekor qiladi, bu erda server sertifikatini saqlangan izlarga nisbatan qo'lda tekshiradi. Muqobil yondashuv — konfiguratsiyani soddalashtiradigan Alamofire ServerTrustManager bilan ishlatish.
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)
}
}
}
Misolda, vakil URLSession'dan autentifikatsiya so'rovini oladi, challenge'dan serverTrust ni chiqaradi va sertifikatning SHA-256 izini saqlangan bilan taqqoslaydi. Iz mos kelsa — ulanish davom etadi, aks holda challenge rad etiladi. Ishlab chiqarish uchun bir nechta backup pins tekshiruvi va monitoring uchun xato qayd etishni qo'shish tavsiya etiladi.
iOS 14 dan boshlab, Apple Info.plist orqali Certificate Pinning uchun o'rnatilgan qo'llab-quvvatlashni qo'shdi. Dasturchi NSAppTransportSecurity kalitida NSPinnedDomains pastki lug'ati bilan ishonchli sertifikatlarni ko'rsatadi. Bu yondashuv kod yozishni talab qilmaydi, lekin kamroq moslashuvchan — pinslarni dinamik o'zgartirish yoki tekshirish xatolarini qayd etish mumkin emas.
Android'da SSL Pinningni amalga oshirishning uchta asosiy usuli bor: OkHttp kutubxonasining CertificatePinner orqali, XML'dagi Network Security Config orqali va HttpsURLConnection'dagi maxsus tekshirish orqali. OkHttp — Retrofit va boshqa HTTP mijozlarida ishlatiladigan eng mashhur va tavsiya etilgan yondashuv.
val certificatePinner = CertificatePinner.Builder()
.add("api.example.com",
"sha256/Wi24BE7j5qLk0iLvPq6ePEsVRqZ1yW0F6wLg=")
.add("api.example.com",
"sha256/FiPq6ePEsVRqZ1yW0F6wLgWi24BE7j5qLk0iL=") // zaxira pin
.build()
val client = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build()
OkHttp konfiguratsiyasida dasturchi domen va bir yoki bir nechta SHA-256 izini ko'rsatadi. Birinchi izda OkHttp server sertifikatini ko'rsatilgan pinslar bilan taqqoslaydi. Moslik bo'lmasa, mijoz SSLPeerUnverifiedException ni tashlaydi. Zaxira pin majburiy — usiz, sertifikat o'zgarganda API so'rovlari darhol muvaffaqiyatsiz bo'la boshlaydi.
Android API 24 dan boshlab XML konfiguratsiyasi orqali deklarativ Certificate Pinningni qo'llab-quvvatlaydi. res/xml/network_security_config.xml fayli domenlar va ularning izlari ro'yxatini o'z ichiga oladi. Bu usul statik konfiguratsiyalar uchun qulay, lekin TOFU yoki anomalyalarni qayd etish bilan maxsus tekshirish mantiqini amalga oshirishga imkon bermaydi.
<!-- 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 mobil ilova xavfsizligini sezilarli darajada oshiradi, lekin operatsion murakkablikni keltiradi. Asosiy afzallik — ildiz CA'lar buzilgan taqdirda ham MITM hujumlaridan himoya. Ilova faqat dasturchi tomonidan aniq ko'rsatilgan sertifikatlarga ishonadi, butun jamoat sertifikat markazlari infratuzilmasiga emas. Bu ayniqsa moliyaviy ilovalar, messenjerlar va nozik ma'lumotlarga ega ilovalar uchun muhimdir.
Asosiy kamchilik — sertifikat rotatsiyasining murakkabligi. Sertifikat muddati tugasa yoki bekor qilinsa, ilovani yangilamagan foydalanuvchilar aloqani yo'qotadi. Bu zaxira pinlar va bosqichma-bosqich yangilash mexanizmi orqali hal qilinadi: yangi ilova eski va yangi sertifikatni biladi, foydalanuvchilar to'liq yangilangandan so'ng eski pin koddan olib tashlanadi. Kamida 2 ta zaxira pin qo'yish tavsiya etiladi — biri joriy sertifikat uchun, biri kelajak uchun.
Yana bir murosa — pinni o'chirmasdan trafikni tuzatish uchun jamoat proksilardan (Charles Proxy, Burp Suite) foydalana olmaslik. Bu ishlanma bosqichida tarmoq so'rovlarini tuzatishni qiyinlashtiradi. Yechim — shartli kompilyatsiya: debug qurilishida pinning o'chirilgan, release'da esa yoqilgan. OWASP o'tish uchun BuildConfig.DEBUG bayrog'idan foydalanishni tavsiya qiladi.
| Aspekt | Afzallik | Kamchilik |
|---|---|---|
| Xavfsizlik | Soxta CA'lar orqali MITMdan himoya | Kalit buzilishida murakkablik |
| Xizmat ko'rsatish | Ishonchni aniq nazorat qilish | Rotatsiya ilova yangilashni talab qiladi |
| Tuzatish | To'g'ri serverga ulanish kafolati | Tuzatish proksilarining bloklanishi |
Tez-tez so'raladigan savollar
Standart HTTPS tekshiruvi ma'lum ildiz CA tomonidan imzolangan har qanday sertifikatga ishonadi. SSL Pinning faqat muayyan sertifikat yoki kalitga ishonadi — agar CA soxta sertifikat bersa, ilova uni rad etadi.
Sertifikatlar odatda 1–2 yil amal qiladi. Joriy sertifikat muddati tugashiga 3–6 oy qolganda pinslarni yangilash, yangi izni zaxira pin sifatida qo'shib, rotatsiyadan keyin eskisini olib tashlash tavsiya etiladi.
Ha, lekin CDN chekka serverlar o'rtasida o'tishda sertifikatlarni o'zgartirishi mumkinligini hisobga olish kerak. Muayyan sertifikat o'rniga ochiq kalitga bog'lanish va bir nechta zaxira pinlardan foydalanish tavsiya etiladi.
Ulanish xato bilan uziladi — Android'da bu SSLPeerUnverifiedException, iOS'da challenge .cancelAuthenticationChallenge bilan rad etiladi. Ilova bu xatoni to'g'ri boshqarishi va foydalanuvchini xabardor qilishi kerak.
Yo'q, lekin OWASP nozik ma'lumotlar bilan ishlaydigan ilovalar uchun tavsiya qiladi: bank, tibbiyot, korporativ tizimlar. Oddiy read-only ilovalar uchun EV sertifikatlari bilan standart HTTPS tekshiruvi odatda yetarli.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.