Certificate Pinning: шта је то, начини везивања сертификата и како га реализовати

Аутор: IT Sectr Објављено: 2026-04-02 Време читања: 8 мин

Certificate Pinning (везивање сертификата) — безбедносна техника при којој мобилна апликација проверава да сертификат сервера одговара унапред познатом узорку, а не једноставно верује било ком сертификату из ланца CA. За разлику од обичне TLS провере, која се ослања на стотине центара за сертификацију, pinning сужава поверење на један конкретан сертификат или његов јавни кључ. Према OWASP Mobile Security Testing Guide (2024), примена Certificate Pinning-а затвара 100% сценарија Man-in-the-Middle напада повезаних са заменом сертификата. OWASP MSTG, 2024

Најважније

  • Certificate Pinning — техника чврстог везивања апликације за конкретан сертификат или јавни кључ сервера.
  • Pinning преко јавног кључа — најфлексибилнији и најбезбеднији начин, који не захтева ажурирање апликације при промени сертификата.
  • Разлика у односу на TLS — при обичном TLS-у клијент верује било ком CA; pinning додаје други ниво провере за конкретан сертификат.
  • Ризик блокирања — при неправилном ажурирању сертификата апликација може изгубити везу са сервером до изласка нове верзије.
  • OkHttp и TrustKit — најпопуларније библиотеке за реализацију pinning-а на Android-у и iOS-у.

Шта је Certificate Pinning?

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-а

Постоји неколико приступа реализацији Certificate Pinning-а, сваки са својим особеностима чувања и провере. Избор методе зависи од архитектуре апликације, учесталости ажурирања сертификата и захтева за флексибилношћу.

Тип pinning-аШта се чуваФлексибилностПример употребе
Certificate PinningЦео X.509 сертификатНискаФиксни сертификат на 1–2 године
Public Key PinningЈавни кључ (SPKI)СредњаПриступ који препоручује OWASP
Hash PinningSHA-256 отисакСредњаПопуларно у OkHttp-у (certificatePinner)
CA PinningПосредни CAВисокаКорпоративне апликације

Најбалансиранијом методом сматра се Public Key Pinning, коју препоручују OWASP и Google. Уместо конкретног сертификата (који се мења сваких 1–2 година) апликација чува отисак SubjectPublicKeyInfo — апстракцију јавног кључа. Ако се сертификат продужава са истим кључем (key reuse), пин остаје важећи. Ако се кључ мења — програмер унапред додаје backup-пин у ажурирање апликације. У мобилним пројектима користи се стратегија min/max pins: минимум 2 пина, укључујући backup, и максимум 4 ради спречавања надувавања и повећања времена провере.

Стратегија избора типа pinning-а

Избор конкретног типа 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-а

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-у

Размотримо пример примене Certificate Pinning-а на Android-у коришћењем OkHttp-а — стандардне библиотеке за мрежне захтеве. OkHttp пружа уграђени CertificatePinner, који прихвата SHA-256 хешеве јавних кључева.

kotlin
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-у преко TrustKit-а

На 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 једноставним речима?

Certificate Pinning — то је као чување отиска прста пријатеља у телефону: памтите како изгледа „исправан“ сертификат сервера и не верујете више никоме, чак и ако неко покаже легитимацију од „званичног“ центра.

По чему се Certificate Pinning разликује од обичног HTTPS-а?

Обични HTTPS верује било ком сертификату потписаном од било ког CA међу стотинама центара. Certificate Pinning додаје проверу „одозго“: сертификат не сме бити само важећи, већ конкретно онај који сте фиксирали у коду апликације.

Како ажурирати сертификат при коришћењу Pinning-а?

Препоручује се чувати 2–3 пина: тренутни и backup-пин за нови сертификат. 1–2 месеца пре промене сертификата објавите нову верзију апликације са додатим пином будућег сертификата. Након промене, стари пин се уклања из следећег издања.

Може ли се Certificate Pinning користити са бесплатним CA?

Да, може. Pinning ради са било којим сертификатима, укључујући Let's Encrypt. Важно је запамтити да бесплатни сертификати имају кратак рок важења (3 месеца), па стратегија backup-пинова и аутоматска ротација постају обавезни.

Како тестирати Certificate Pinning у апликацији?

За тестирање pinning-а користите Burp Suite или mitmproxy. Ако је апликација са pinning-ом правилно подешена, прокси алат неће моћи да пресретне саобраћај — веза ће бити прекинута у фази handshake-а. За интеграционе тестове користите MockWebServer од OkHttp-а.

Резиме

  • Certificate Pinning — техника везивања сертификата, која штити од Man-in-the-Middle напада и замене CA.
  • Public Key Pinning — метод који препоручује OWASP, заснован на отиску јавног кључа, а не целог сертификата.
  • OkHttp CertificatePinner на Android-у и TrustKit на iOS-у — главни алати за реализацију pinning-а у мобилним пројектима.
  • Стратегија 2+ пинова спречава блокирање апликације при промени сертификата на серверу.
  • SHA-256 pinning захтева openssl команду за генерисање отиска јавног кључа сервера.
  • Grace-период — коришћење backup-пина са преклапањем датума важења смањује ризик губитка везе на нулу.
  • Препорука: примените pinning преко јавног кључа за све продакшен домене са резервним пином и подесите праћење на прекид везе.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође