Certificate Pinning (везивање сертификата) — безбедносна техника при којој мобилна апликација проверава да сертификат сервера одговара унапред познатом узорку, а не једноставно верује било ком сертификату из ланца CA. За разлику од обичне TLS провере, која се ослања на стотине центара за сертификацију, pinning сужава поверење на један конкретан сертификат или његов јавни кључ. Према OWASP Mobile Security Testing Guide (2024), примена Certificate Pinning-а затвара 100% сценарија Man-in-the-Middle напада повезаних са заменом сертификата. OWASP MSTG, 2024
Најважније
Certificate Pinning — безбедносни механизам при којем апликација чува (или „ушива“ — pin) узорак сертификата сервера и при свакој вези упоређује добијени сертификат са тим узорком. Ако се сертификат не поклапа — веза се прекида, чак и ако је званично потписан од стране поверљивог центра за сертификацију. Ово штити од напада при којима нападач добија лажни сертификат преко компромитованог CA (као што се десило са DigiNotar 2011. или Comodo 2011. године).
Процес pinning-а састоји се од три фазе: издвајање отиска (fingerprint) сертификата или јавног кључа из поузданог примера; чување тог отиска у коду или ресурсима апликације; упоређивање у фази TLS handshake-а. Програмер може да фиксира SHA-256 отисак целог сертификата или само јавног кључа (Public Key Pinning). Други приступ је пожељнији: при продужењу сертификата јавни кључ често остаје исти, па апликација не губи везу са сервером. Према препоруци OWASP-а, минималан број пинова је 2: један тренутни и један backup за случај ротације кључева. Савремене библиотеке, попут OkHttp-а и TrustKit-а, аутоматизују процес провере наведених пинова при свакој TLS вези без додатних трошкова програмера. Важно је разумети да pinning не замењује стандардну TLS проверу, већ је допуњује: прво се извршава обичан handshake са валидацијом ланца сертификата, а затим — додатна pinning провера. Таква двослојна заштита отклања рањивости повезане са компромитовањем CA, укључујући случајеве погрешне издаје сертификата и нападе на инфраструктуру центара за сертификацију.
Постоји неколико приступа реализацији Certificate Pinning-а, сваки са својим особеностима чувања и провере. Избор методе зависи од архитектуре апликације, учесталости ажурирања сертификата и захтева за флексибилношћу.
| Тип pinning-а | Шта се чува | Флексибилност | Пример употребе |
|---|---|---|---|
| Certificate Pinning | Цео X.509 сертификат | Ниска | Фиксни сертификат на 1–2 године |
| Public Key Pinning | Јавни кључ (SPKI) | Средња | Приступ који препоручује OWASP |
| Hash Pinning | SHA-256 отисак | Средња | Популарно у OkHttp-у (certificatePinner) |
| CA Pinning | Посредни CA | Висока | Корпоративне апликације |
Најбалансиранијом методом сматра се Public Key Pinning, коју препоручују OWASP и Google. Уместо конкретног сертификата (који се мења сваких 1–2 година) апликација чува отисак SubjectPublicKeyInfo — апстракцију јавног кључа. Ако се сертификат продужава са истим кључем (key reuse), пин остаје важећи. Ако се кључ мења — програмер унапред додаје backup-пин у ажурирање апликације. У мобилним пројектима користи се стратегија min/max pins: минимум 2 пина, укључујући backup, и максимум 4 ради спречавања надувавања и повећања времена провере.
Избор конкретног типа pinning-а зависи од архитектуре и захтева апликације. За јавне мобилне апликације које раде са REST API-јем преко једног домена, оптималан је Public Key Pinning са два пина преко OkHttp-а или TrustKit-а. За корпоративне апликације са сопственим центром за сертификацију погодан је CA Pinning — он не захтева ажурирање при промени клијентских сертификата, јер је поверење везано за CA, а не за крајњи сертификат. За IoT и embedded системе препоручује се Certificate Pinning са фиксирањем целог сертификата: уређаји се ретко ажурирају, па је контрола над целим ланцем поверења критична. Праћење expiry-датума пинова — обавезна пракса: подесите алерте 30, 14 и 7 дана пре истека рока важења сертификата, како бисте стигли да објавите ажурирање апликације са новим пиновима пре него што тренутни сертификат постане неважећи. За аутоматизацију објављивања ажурирања са новим пиновима препоручује се коришћење Firebase Remote Config-а или сопственог API-ја за конфигурацију, који омогућава динамичко ажурирање листе пинова без објављивања нове верзије у продавници апликација.
Certificate Pinning значајно повећава безбедност мобилне апликације, али намеће operational-оптерећење развојном тиму. Важно је одмерити предности заштите и ризике блокирања везе при неправилној реализацији.
Главна предност — заштита од Man-in-the-Middle напада, укључујући случајеве компромитовања CA. Pinning чини бескорисним лажне сертификате издате од стране нападача: чак и ако је CA потписао фалсификат, апликација ће га одбацити. Додатна предност — заштита од корпоративних прокси сервера који замењују сертификате ради инспекције саобраћаја. Према Google Security Blog (2023), апликације са pinning-ом имају за 86% мање шанси да буду пробијене кроз пресретање саобраћаја у поређењу са апликацијама које користе само стандардну TLS проверу.
Главни недостатак pinning-а — ризик самоблокирања: ако се сертификат сервера промени (продужење, промена провајдера, ротација кључева) пре изласка ажурирања апликације, корисници губе приступ серверу. Додатни минуси: сложеност отклањања грешака (при свакој промени подешавања потребно је ажурирати пинове), повећање величине APK-а за 5–15 KB при коришћењу TrustKit-а и немогућност брзог враћања промена без новог издања. Ради минимизације ризика примењују се backup-пинови, аутоматска ротација на 2–3 месеца и grace-период, када апликација прихвата и стари и нови сертификат. Важно је такође узети у обзир да при развоју са укљученим pinning-ом није могуће користити прокси алате (Burp Suite, Charles) за отклањање грешака у мрежним захтевима — за dev-верзије pinning мора бити искључен преко BuildConfig.DEBUG флага, а QA тестирање треба спроводити на релизној сигнатури са укљученом заштитом. Неки тимови користе staging-домен са посебним pinning-сертификатом за dev-окружење, како би задржали заштиту и у фази развоја.
Размотримо пример примене Certificate Pinning-а на Android-у коришћењем OkHttp-а — стандардне библиотеке за мрежне захтеве. OkHttp пружа уграђени CertificatePinner, који прихвата SHA-256 хешеве јавних кључева.
val certificatePinner = CertificatePinner.Builder()
.add(
"api.example.com",
"sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
)
.add(
"api.example.com",
"sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB="
)
.build()
val client = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build()
У коду изнад додајемо два пина за домен api.example.com: главни (тренутни сертификат) и backup-пин (за случај ротације). OkHttp аутоматски проверава да сертификат сервера одговара једном од наведених SHA-256 отисака. За добијање SHA-256 отиска сертификата користи се команда: openssl s_client -connect api.example.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64. Важно је чувати отиске не у отвореном облику у коду, већ шифроване или обфусковане: статичка анализа MobSF лако проналази голе SHA-256 низове у DEX фајловима. Препоручује се чување пинова у ресурсима res/raw, шифрованих преко AES-а, и њихово дешифровање при покретању апликације преко нативног кода (NDK/JNI).
На iOS-у главни алат за Certificate Pinning је библиотека TrustKit отвореног кода. За разлику од OkHttp-а, TrustKit се конфигурише декларативно преко Info.plist-а, што омогућава промену пинова без прекомпајлирања апликације. Конфигурација укључује речник са доменима и низом SHA-256 отисака јавних кључева. TrustKit аутоматски пресреће NSURLSession захтеве и проверава сертификате пре почетка преноса података. Критична особина TrustKit-а — подршка за pin validation извештаје: библиотека може слати извештаје на наведени endpoint при неусаглашености пина, што омогућава брзу реакцију на аномалије сертификата. Apple такође пружа нативни механизам NSPinnedDomains у Info.plist-у од iOS 14, али TrustKit остаје пожељнији избор због флексибилније конфигурације, подршке за извештаје и могућности вруће замене пинова без ажурирања оперативног система. Важно је напоменути да се TrustKit интегрише са URLSession-ом преко didReceiveChallenge делегата, враћајући .performDefaultHandling при успешној провери пина и .cancelAuthenticationChallenge при неусаглашености. За праћење pin validation извештаја препоручује се постављање посебног endpoint-а, који анализира учесталост грешака: ако се број извештаја нагло повећа — то може указивати на MitM напад или блиско истекање сертификата, што захтева хитно ажурирање пинова.
Често постављана питања
Certificate Pinning — то је као чување отиска прста пријатеља у телефону: памтите како изгледа „исправан“ сертификат сервера и не верујете више никоме, чак и ако неко покаже легитимацију од „званичног“ центра.
Обични HTTPS верује било ком сертификату потписаном од било ког CA међу стотинама центара. Certificate Pinning додаје проверу „одозго“: сертификат не сме бити само важећи, већ конкретно онај који сте фиксирали у коду апликације.
Препоручује се чувати 2–3 пина: тренутни и backup-пин за нови сертификат. 1–2 месеца пре промене сертификата објавите нову верзију апликације са додатим пином будућег сертификата. Након промене, стари пин се уклања из следећег издања.
Да, може. Pinning ради са било којим сертификатима, укључујући Let's Encrypt. Важно је запамтити да бесплатни сертификати имају кратак рок важења (3 месеца), па стратегија backup-пинова и аутоматска ротација постају обавезни.
За тестирање pinning-а користите Burp Suite или mitmproxy. Ако је апликација са pinning-ом правилно подешена, прокси алат неће моћи да пресретне саобраћај — веза ће бити прекинута у фази handshake-а. За интеграционе тестове користите MockWebServer од OkHttp-а.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође