Mobil
SSL pinning: mobil ilovada sertifikatni mahkamlash
Ilova tizim ishongan har qanday sertifikatni qabul qilsa, trafikni ushlash mumkin. Android va Flutter'da pinning qanday sozlanadi va sertifikat almashuviga qanday tayyorlanadi.
· 7 daq. o'qish

O'z ilovamiz ekspertizasida Android uchun yuqori darajali topilmalardan biri "xavfsiz bo'lmagan sertifikat tekshiruvi" edi. Ilova HTTPS ishlatardi, sertifikat ham haqiqiy edi. Muammo boshqa joyda: ilova qurilma ishongan har qanday sertifikat markazini (CA) qabul qilardi. Bu maqolada nega bu yetarli emasligini, SSL pinning qanday ishlashini va uni sertifikat almashuvida ilovani buzib qo'ymasdan qanday joriy qilishni ko'rib chiqamiz.
Muammo: HTTPS bor, lekin ishonch juda keng
Odatda ilova serverga ulanganda tizim sertifikat zanjirini tekshiradi: sertifikat qurilmadagi ishonchli CA'lardan biri tomonidan berilganmi? Bu ro'yxatda o'nlab CA bor. Bundan tashqari, foydalanuvchi yoki qurilmaga kirgan boshqa shaxs o'z CA'sini qo'shishi mumkin.
Ekspert aynan shuni sinaydi: qurilmaga o'z proksi vositasining CA'sini o'rnatadi va ilova trafigini ochib o'qishga harakat qiladi. Agar ilova hech narsa sezmasdan ishlayversa, login, token va moliyaviy ma'lumotlar ochiq ko'rinadi. Bu MASVS'ning NETWORK guruhiga va OWASP Mobile Top 10 2024'dagi M5 (Insecure Communication) toifasiga tegishli.
SSL pinning nima
Pinning — ilovaga "faqat shu aniq kalit yoki sertifikatga ishon" deb aytish. Ilova ichida kutilayotgan ochiq kalitning xeshi saqlanadi. Ulanish vaqtida server zanjiridagi sertifikatlardan biri shu xeshga mos kelmasa, ulanish uziladi — hatto tizim bu sertifikatga ishonsa ham.
Odatda sertifikatning o'zi emas, uning ochiq kaliti (SPKI) xeshlanadi. Sertifikat yangilansa ham kalit o'zgarmasligi mumkin, bu esa pin'ni barqarorroq qiladi.
Nimani mahkamlash kerak: leaf, oraliq yoki root CA
Bu eng muhim qaror, chunki noto'g'ri tanlov ilovani bir kun ichida ishlamay qolishiga olib kelishi mumkin.
- Leaf (server sertifikati) — eng qattiq variant. Lekin server sertifikati muntazam yangilanadi. Masalan, Let's Encrypt sertifikatlari har 90 kunda almashadi. Yangi sertifikat yangi kalit bilan chiqsa, ilovaning barcha eski versiyalari serverga ulana olmay qoladi.
- Oraliq (intermediate) CA — o'rtacha variant, lekin CA ham oraliq sertifikatlarini almashtirib turadi.
- Root CA — eng barqaror variant. Root sertifikatlar yillar davomida o'zgarmaydi.
Biz o'z ilovamizda aniq tanlangan root CA'larga mahkamladik. Bu begona va proksi CA'larni to'liq kesadi, lekin server sertifikatini oddiy tartibda yangilashga to'sqinlik qilmaydi.
Qoida: har doim kamida ikkita pin bo'lsin — asosiy va zaxira. Zaxira pin boshqa CA'ga tegishli bo'lgani ma'qul, shunda bitta CA bilan muammo chiqsa ham ilova ishlashda davom etadi.
Android: network_security_config
Android 7.0 dan boshlab pinning'ni kod yozmasdan, XML orqali sozlash mumkin. res/xml/network_security_config.xml fayli:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="false" />
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">api.example.uz</domain>
<pin-set expiration="2027-12-31">
<!-- asosiy root CA ochiq kalitining SHA-256 xeshi -->
<pin digest="SHA-256">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</pin>
<!-- zaxira: boshqa root CA -->
<pin digest="SHA-256">BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=</pin>
</pin-set>
</domain-config>
</network-security-config>
Va AndroidManifest.xml ichida:
<application
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="false">
Android pin'ni zanjirdagi istalgan sertifikat bilan solishtiradi, shuning uchun root CA xeshi ham ishlaydi. expiration atributi pin'larning amal qilish muddatini belgilaydi: bu sanadan keyin pinning o'chadi va oddiy tekshiruvga qaytiladi. Bu ilova uzoq vaqt yangilanmagan qurilmalarda butunlay ishlamay qolishidan saqlaydi, lekin sanani o'z vaqtida yangilab turishni unutmang.
Root CA ochiq kalitining xeshini shunday olish mumkin:
openssl x509 -in root_ca.pem -pubkey -noout \
| openssl pkey -pubin -outform der \
| openssl dgst -sha256 -binary \
| openssl enc -base64
Flutter: Dart tomoni alohida sozlanadi
Bu Flutter ilovalarida ko'p uchraydigan xato. Dart'ning HTTP klienti Android tizim tarmoq stekini ishlatmaydi, shuning uchun network_security_config Dart so'rovlariga ta'sir qilmaydi. Ikkalasini ham sozlash kerak.
Dart'da biz tizimdagi ishonchli ro'yxatni o'chirib, faqat tanlangan root CA'larni yukladik:
final context = SecurityContext(withTrustedRoots: false);
context.setTrustedCertificatesBytes(rootCaPemBytes);
final client = HttpClient(context: context);
Bu holda qurilmaga qanday CA o'rnatilganidan qat'i nazar, Dart klienti faqat ilova bilan birga kelgan root sertifikatlarga ishonadi. Bir nechta root kerak bo'lsa, ularni bitta PEM faylga birlashtirish mumkin.
Sertifikat almashuviga tayyorgarlik
Pinning'ning asosiy xavfi — o'z foydalanuvchilaringizni o'zingiz uzib qo'yish. Bunga yo'l qo'ymaslik uchun:
- Root CA'ga mahkamlang, leaf'ga emas, agar leaf kalitini o'zingiz qat'iy nazorat qilmasangiz.
- Zaxira pin qo'shing — boshqa CA yoki oldindan tayyorlangan zaxira kalit.
- Hosting yoki CA'ni almashtirishni oldindan rejalashtiring. Yangi CA pin'ini avval ilovaning yangi versiyasiga qo'shing, foydalanuvchilar yangilanguncha kuting, shundan keyingina serverdagi sertifikatni almashtiring.
expirationsanasini kuzatib boring va uni har bir katta reliz bilan yangilang.- Barcha domenlarni hisobga oling — API, fayl serveri, analitika. Pinning faqat asosiy domenda bo'lsa, qolganlari ochiq qoladi.
Tekshirib ko'ring
Proksi vositasi (masalan, Burp Suite yoki mitmproxy) CA'sini test qurilmasiga o'rnating va ilovani ishga tushiring. To'g'ri sozlangan ilova serverga ulana olmasligi va proksida shifrlangan trafik ko'rinmasligi kerak. Keyin oddiy tarmoqda hamma narsa ishlashini tekshiring.
Pinning'ni Frida orqali o'chirib qo'yish mumkinligini ham yodda tuting. Shuning uchun u RASP va root aniqlash bilan birga ishlaganda samarali bo'ladi.
Xulosa
SSL pinning — bir necha qator konfiguratsiya, lekin noto'g'ri qilinsa, ilovani to'xtatib qo'yishi mumkin. To'g'ri yondashuv: root CA'larga mahkamlash, zaxira pin, Android va Dart tomonlarini alohida sozlash va almashuvni oldindan rejalashtirish.
Ilovangiz trafigini ushlab bo'ladimi yoki yo'qmi, bilmoqchi bo'lsangiz, skanerlash uchun ariza qoldiring. Biz tekshiramiz, teshiklarni ko'rsatamiz va ekspertizaga tayyorlashda yordam beramiz.


