Certificate Pinning: co to je, metody připoutání certifikátů a jak implementovat

Autor: IT Sectr Publikováno: 2026-04-02 Doba čtení: 8 min

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 — technika pevného připoutání aplikace ke konkrétnímu certifikátu nebo veřejnému klíči serveru.
  • Pinning pomocí veřejného klíče — nejflexibilnější a nejbezpečnější způsob, který nevyžaduje aktualizaci aplikace při změně certifikátu.
  • Rozdíl od TLS — při běžném TLS klient důvěřuje jakémkoli CA; pinning přidává druhou úroveň ověření pro konkrétní certifikát.
  • Riziko blokování — při nesprávné aktualizaci certifikátu může aplikace ztratit spojení se serverem do vydání nové verze.
  • OkHttp a TrustKit — nejoblíbenější knihovny pro implementaci pinning na Android a iOS.

Co je Certificate Pinning?

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).

Jak funguje připoutání certifikátu

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.

Typy Certificate Pinning

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 pinningCo se ukládáFlexibilitaPříklad použití
Certificate PinningCelý certifikát X.509NízkáFixní certifikát na 1–2 roky
Public Key PinningVeřejný klíč (SPKI)StředníPřístup doporučený OWASP
Hash PinningOtisku SHA-256StředníOblíbené v OkHttp (certificatePinner)
CA PinningProstřední CAVysoká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í.

Strategie výběru typu pinning

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.

Výhody a nevýhody Certificate Pinning

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.

Implementace Certificate Pinning v Android

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íčů.

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()

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).

Implementace na iOS pomocí TrustKit

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

Co je Certificate Pinning jednoduchými slovy?

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.

Čím se Certificate Pinning liší od běžného HTTPS?

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.

Jak aktualizovat certifikát při použití Pinning?

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í.

Lze použít Certificate Pinning s bezplatnými CA?

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.

Jak testovat Certificate Pinning v aplikaci?

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í

  • Certificate Pinning — technika připoutání certifikátu chranící před útoky Man-in-the-Middle a náhradou CA.
  • Public Key Pinning — doporučená metoda OWASP založená na otisku veřejného klíče, nikoli celého certifikátu.
  • OkHttp CertificatePinner na Android a TrustKit na iOS — hlavní nástroje implementace pinning v mobilních projektech.
  • Strategie 2+ pinů zabraňuje blokování aplikace při změně certifikátu na serveru.
  • SHA-256 pinning vyžaduje příkaz openssl pro generování otisku veřejného klíče serveru.
  • Období milosti (grace period) — použití záložního pinu s překrývajícími se daty platnosti snižuje riziko ztráty spojení na nulu.
  • Doporučení: implementujte pinning pomocí veřejného klíče pro všechny produkční domény se záložním pinem a nastavte monitorování přerušení spojení.

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í.

Prodiskutovat projekt

Přečtěte si také