Certificate Pinning (připoutání certifikátu) — je bezpečnostní technika, při které mobilní aplikace kontroluje, zda certifikát serveru odpovídá předem známému vzorku, a ne jen důvěřuje jakémkoli certifikátu z řetězce CA. Na rozdíl od běžného TLS ověření, které se spoléhá na stovky certifikačních autorit, pinning zužuje důvěru na jeden konkrétní certifikát nebo jeho veřejný klíč. Podle OWASP Mobile Security Testing Guide (2024) implementace Certificate Pinning uzavírá 100% scénářů útoků Man-in-the-Middle souvisejících s náhradou certifikátu. OWASP MSTG, 2024
Hlavní body
Certificate Pinning — je bezpečnostní mechanismus, při kterém aplikace ukládá (nebo „zašije” — pin) vzorek certifikátu serveru a při každém spojení porovnává obdržený certifikát s tímto vzorkem. Pokud certifikát nesouhlasí — spojení je přerušeno, i když je oficiálně podepsán důvěryhodnou certifikační autoritou. To chraní před útoky, při kterých útočník získá falešný certifikát prostřednictvím kompromitovaného CA (jako se stalo s DigiNotar v roce 2011 nebo Comodo v roce 2011).
Proces pinning se skládá ze tří fází: extrakce otisku (fingerprint) certifikátu nebo veřejného klíče z důvěryhodné instance; uložení tohoto otisku v kódu nebo zdrojích aplikace; porovnání ve fázi TLS-handshake. Vývojář může zafixovat otisk SHA-256 celého certifikátu nebo pouze veřejného klíče (Public Key Pinning). Druhý přístup je preferovaný: při prodloužení certifikátu veřejný klíč často zůstává stejný a aplikace neztrácí spojení se serverem. Podle doporučení OWASP je minimální počet pinů — 2: jeden aktuální a jeden záložní pro případ rotace klíčů. Moderní knihovny, jako OkHttp a TrustKit, automatizují proces ověřování zadaných pinů při každém TLS spojení bez další námahy pro vývojáře. Je důležité pochopit, že pinning nenahrazuje standardní TLS ověření, ale doplňuje jej: nejprve se provede běžný handshake s validací řetězce certifikátů, poté — dodatečné ověření pinning. Taková dvojúrovňová ochrana eliminuje zranitelnosti spojené s kompromitací CA, včetně případů chybného vydávání certifikátů a útoků na infrastrukturu certifikačních autorit.
Existuje několik přístupů k implementaci Certificate Pinning, každý s vlastními charakteristikami ukládání a ověřování. Výběr metody závisí na architektuře aplikace, četnosti aktualizace certifikátů a požadavcích na flexibilitu.
| Typ pinning | Co se ukládá | Flexibilita | Příklad použití |
|---|---|---|---|
| Certificate Pinning | Celý certifikát X.509 | Nízká | Fixní certifikát na 1–2 roky |
| Public Key Pinning | Veřejný klíč (SPKI) | Střední | Přístup doporučený OWASP |
| Hash Pinning | Otisku SHA-256 | Střední | Oblíbené v OkHttp (certificatePinner) |
| CA Pinning | Prostřední CA | Vysoká | Podnikové aplikace |
Nejvyváženější metodou je Public Key Pinning, doporučený OWASP a Google. Místo konkrétního certifikátu (který se mění každých 1–2 roky) aplikace ukládá otisk SubjectPublicKeyInfo — abstrakci veřejného klíče. Pokud je certifikát prodloužen se stejným klíčem (key reuse), pin zůstává platný. Pokud se klíč mění — vývojář předem přidá záložní pin do aktualizace aplikace. V mobilních projektech se používá strategie min/max pins: minimálně 2 piny, včetně záložního, a maximálně 4 pro zabránění nafouknutí a zvýšení času ověřování.
Výběr konkrétního typu pinning závisí na architektuře a požadavcích aplikace. Pro veřejné mobilní aplikace komunikující s REST API přes jednu doménu je optimální Public Key Pinning se dvěma piny přes OkHttp nebo TrustKit. Pro podnikové aplikace s vlastní certifikační autoritou je vhodný CA Pinning — nevyžaduje aktualizaci při změně klientských certifikátů, protože důvěra je vázána na CA, nikoli na koncový certifikát. Pro IoT a vestavěné systémy se doporučuje Certificate Pinning s fixací celého certifikátu: zařízení se zřídka aktualizují, proto je kontrola nad celým řetězcem důvěry kritická. Monitorování dat expirace pinů — povinná praxe: nastavte upozornění 30, 14 a 7 dní před vypršením certifikátu, abyste stihli vydat aktualizaci aplikace s novými piny, než aktuální certifikát ztratí platnost. Pro automatizaci vydávání aktualizací s novými piny se doporučuje Firebase Remote Config nebo vlastní konfigurační API, které umožňuje dynamicky aktualizovat seznam pinů bez publikování nové verze v obchodě s aplikacemi.
Certificate Pinning výrazně zvyšuje bezpečnost mobilní aplikace, ale klade provozní zátěž na vývojový tým. Je důležité zvážit výhody ochrany a riziko blokování spojení při nesprávné implementaci.
Hlavní výhoda — ochrana před útoky Man-in-the-Middle, včetně případů kompromitace CA. Pinning činí nepoužitelnými falešné certifikáty vydané útočníkem: i když CA podepsal padělek, aplikace jej odmítne. Další výhoda — ochrana proti podnikovým proxy serverům, které nahrazují certifikáty pro kontrolu provozu. Podle Google Security Blog (2023) mají aplikace s pinning o 86% nižší šanci na prolomení prostřednictvím zachycení provozu ve srovnání s aplikacemi používajícími pouze standardní TLS ověření.
Hlavní nevýhoda pinning — riziko samoblokování: pokud se certifikát serveru změní (prodloužení, změna poskytovatele, rotace klíčů) před vydáním aktualizace aplikace, uživatelé ztratí přístup k serveru. Další nevýhody: obtížnost ladění (při každé změně nastavení je třeba aktualizovat piny), zvýšení velikosti APK o 5–15 KB při použití TrustKit a nemožnost rychlého vrácení změn bez nové verze. Pro minimalizaci rizik se používají záložní piny, automatická rotace každých 2–3 měsíce a období milosti (grace period), kdy aplikace přijímá starý i nový certifikát. Je také třeba mít na paměti, že při zapnutém pinning během vývoje nelze používat proxy nástroje (Burp Suite, Charles) pro ladění síťových požadavků — pro vývojové sestavení by měl být pinning vypnut prostřednictvím příznaku BuildConfig.DEBUG a QA testování by mělo být prováděno na release podpisu se zapnutou ochranou. Některé týmy používají staging doménu s odděleným pinning certifikátem pro vývojové prostředí, aby zachovaly ochranu i ve fázi vývoje.
Podívejme se na příklad implementace Certificate Pinning na Android pomocí OkHttp — standardní knihovny pro síťové požadavky. OkHttp poskytuje vestavěný CertificatePinner, který přijímá SHA-256 hashe veřejných klíčů.
val certificatePinner = CertificatePinner.Builder()
.add(
"api.example.com",
"sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
)
.add(
"api.example.com",
"sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB="
)
.build()
val client = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build()
V kódu výše přidáváme dva piny pro doménu api.example.com: hlavní (aktuální certifikát) a záložní (pro případ rotace). OkHttp automaticky kontroluje, zda certifikát serveru odpovídá jednomu z uvedených SHA-256 otisků. Pro získání SHA-256 otisku certifikátu se používá příkaz: openssl s_client -connect api.example.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64. Je důležité ukládat otisky ne v otevřené podobě v kódu, ale šifrované nebo zatemňené: statická analýza MobSF snadno najde holé SHA-256 řetězce v DEX souborech. Doporučuje se ukládat piny v res/raw zdrojích, šifrované AES, a dešifrovat je při startu aplikace prostřednictvím nativního kódu (NDK/JNI).
Na iOS je hlavním nástrojem pro Certificate Pinning opensourcová knihovna TrustKit. Na rozdíl od OkHttp se TrustKit konfiguruje deklarativně prostřednictvím Info.plist, což umožňuje měnit piny bez překompilování aplikace. Konfigurace obsahuje slovník s doménami a pole SHA-256 otisků veřejných klíčů. TrustKit automaticky zachycuje NSURLSession požadavky a kontroluje certifikáty před zahájením přenosu dat. Klíčovou vlastností TrustKit je podpora zpráv o validaci pinů: knihovna může odesílat zprávy na zadaný endpoint při neshodě pinu, což umožňuje rychle reagovat na anomálie certifikátů. Apple také poskytuje nativní mechanismus NSPinnedDomains v Info.plist od iOS 14, ale TrustKit zůstává preferovanou volbou díky flexibilnější konfiguraci, podpoře hlášení a možnosti horké výměny pinů bez aktualizace systému. TrustKit se integruje s URLSession prostřednictvím delegáta didReceiveChallenge, vrací .performDefaultHandling při úspěšném ověření pinu a .cancelAuthenticationChallenge při neshodě. Pro monitorování zpráv o validaci pinů se doporučuje nakonfigurovat samostatný endpoint, který analyzuje četnost chyb: pokud počet zpráv náhle vzroste — může to znamenat útok MitM nebo blížící se vypršení certifikátu, vyžadující okamžitou aktualizaci pinů.
Často kladené otázky
Certificate Pinning — je jako uložení otisku prstu přítele v telefonu: zapamatujete si, jak vypadá „správný” certifikát serveru a už nikomu jinému nedůvěřujete, i když někdo předloží průkaz z „oficiálního” centra.
Běžný HTTPS důvěřuje jakémkoli certifikátu podepsanému jakýmkoli CA ze stovek center. Certificate Pinning přidává ověření „shora”: certifikát musí být nejen platný, ale konkrétně ten, který jste zafixovali v kódu aplikace.
Doporučuje se ukládat 2–3 piny: aktuální a záložní pro nový certifikát. 1–2 měsíce před změnou certifikátu vydéjte novou verzi aplikace s přidaným pinem budoucího certifikátu. Po změně je starý pin odstraněn z dalšího vydání.
Ano, lze. Pinning funguje s jakýmkoli certifikáty, včetně Let's Encrypt. Je důležité pamatovat, že bezplatné certifikáty mají krátkou dobu platnosti (3 měsíce), proto strategie záložních pinů a automatická rotace se stávají povinnými.
Pro testování pinning použijte Burp Suite nebo mitmproxy. Pokud je aplikace s pinning správně nakonfigurována, proxy nástroj nebude schopen zachytit provoz — spojení bude přerušeno ve fázi handshake. Pro integrační testy použijte MockWebServer od OkHttp.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také