Certificate Pinning (tanúsítványrögzítés) — egy biztonsági technika, amelynek során a mobilalkalmazás ellenőrzi, hogy a szerver tanúsítványa megfelel-e egy előre ismert mintának, és nem bízik meg egyszerűen bármelyik tanúsítványban a CA-láncból. Ellentétben a szokásos TLS-ellenőrzéssel, amely több száz tanúsítványkiadóra támaszkodik, a pinning a bizalmat egyetlen konkrét tanúsítványra vagy annak nyilvános kulcsára szűkíti. Az OWASP Mobile Security Testing Guide (2024) szerint a Certificate Pinning bevezetése a tanúsítványcsere kapcsán felmerülő Man-in-the-Middle támadási forgatókönyvek 100%-át lezárja. OWASP MSTG, 2024
Főbb pontok
Certificate Pinning — egy biztonsági mechanizmus, amelynek során az alkalmazás eltárolja (vagy “bevarrja” — pin) a szerver tanúsítványának egy mintáját, és minden kapcsolatnál összehasonlítja a kapott tanúsítványt ezzel a mintával. Ha a tanúsítvány nem egyezik — a kapcsolat megszakad, még akkor is, ha azt hivatalosan egy megbízható tanúsítványkiadó írta alá. Ez védelmet nyújt azok ellen a támadások ellen, amelyek során a támadó egy feltört CA-n keresztül hamis tanúsítványhoz jut (mint történt a DigiNotar esetében 2011-ben vagy a Comodo esetében 2011-ben).
A pinning folyamata három szakaszból áll: a tanúsítvány vagy nyilvános kulcs ujjlenyomatának (fingerprint) kinyerése egy megbízható példányból; ennek az ujjlenyomatnak a tárolása az alkalmazás kódjában vagy erőforrásaiban; összehasonlítás a TLS-kézfogás szakaszában. A fejlesztő rögzítheti a teljes tanúsítvány SHA-256 ujjlenyomatát vagy csak a nyilvános kulcsét (Public Key Pinning). A második megközelítés előnyösebb: a tanúsítvány meghosszabbításakor a nyilvános kulcs gyakran változatlan marad, és az alkalmazás nem veszíti el a kapcsolatot a szerverrel. Az OWASP ajánlása szerint a minimális pinszám — 2: egy aktuális és egy tartalék kulcsrotáció esetére. A modern könyvtárak, mint az OkHttp és a TrustKit, automatizálják a megadott pinek ellenőrzési folyamatát minden TLS-kapcsolatnál, külön fejlesztői ráfordítás nélkül. Fontos megérteni, hogy a pinning nem helyettesíti a szabványos TLS-ellenőrzést, hanem kiegészíti azt: először a szokásos kézfogás történik a tanúsítványlánc érvényesítésével, majd — a kiegészítő pinning-ellenőrzés. Az ilyen kétszintű védelem kiküszöböli a CA feltörésével kapcsolatos sérülékenységeket, beleértve a tanúsítványok hibás kiadásának eseteit és a tanúsítványkiadók infrastruktúrája elleni támadásokat.
A Certificate Pinning megvalósításának több megközelítése létezik, mindegyik saját tárolási és ellenőrzési jellemzőkkel. A módszer kiválasztása az alkalmazás architektúrájától, a tanúsítványfrissítések gyakoriságától és a rugalmassági követelményektől függ.
| Pinning típusa | Mit tárol | Rugalmasság | Használati példa |
|---|---|---|---|
| Certificate Pinning | Teljes X.509 tanúsítvány | Alacsony | Rögzített tanúsítvány 1–2 évre |
| Public Key Pinning | Nyilvános kulcs (SPKI) | Közepes | OWASP által ajánlott megközelítés |
| Hash Pinning | SHA-256 ujjlenyomat | Közepes | Népszerű az OkHttp-ban (certificatePinner) |
| CA Pinning | Köztes CA | Magas | Vállalati alkalmazások |
A legkiegyensúlyozottabb módszer a Public Key Pinning, amelyet az OWASP és a Google ajánl. Egy adott tanúsítvány (amely 1–2 évente változik) helyett az alkalmazás a SubjectPublicKeyInfo ujjlenyomatot tárolja — a nyilvános kulcs absztrakcióját. Ha a tanúsítványt ugyanazzal a kulccsal hosszabbítják meg (key reuse), a pin érvényes marad. Ha a kulcs változik — a fejlesztő előre hozzáad egy tartalék pint az alkalmazás frissítéséhez. Mobilos projektekben a min/max pins stratégiát használják: minimum 2 pin, beleértve a tartalékot, és maximum 4 a felfúvódás és az ellenőrzési idő növekedésének megelőzésére.
Az adott pinning típus kiválasztása az alkalmazás architektúrájától és követelményeitől függ. Az egy domainen keresztül REST API-val kommunikáló nyilvános mobilalkalmazások számára a Public Key Pinning két pinnel az OkHttp vagy TrustKit segítségével optimális. A saját tanúsítványkiadóval rendelkező vállalati alkalmazásokhoz a CA Pinning megfelelő — nem igényel frissítést az ügyfél-tanúsítványok változásakor, mivel a bizalom a CA-hoz kötődik, nem a végtanúsítványhoz. IoT és beágyazott rendszerek esetében a teljes tanúsítvány rögzítésével járó Certificate Pinning ajánlott: az eszközöket ritkán frissítik, ezért a teljes bizalmi lánc feletti ellenőrzés kritikus. A pinek lejárati dátumainak figyelése — kötelező gyakorlat: állítson be figyelmeztetéseket 30, 14 és 7 nappal a tanúsítvány lejárta előtt, hogy legyen ideje kiadni az alkalmazás frissítését új pinekkel, mielőtt az aktuális tanúsítvány érvénytelenné válik. Az új pinekkel történő frissítések kiadásának automatizálásához ajánlott a Firebase Remote Config vagy saját konfigurációs API használata, amely lehetővé teszi a pinlista dinamikus frissítését anélkül, hogy új verziót kellene közzétenni az alkalmazásboltban.
Certificate Pinning jelentősen növeli a mobilalkalmazás biztonságát, de működési terhet ró a fejlesztőcsapatra. Fontos mérlegelni a védelem előnyeit és a kapcsolat blokkolásának kockázatát helytelen megvalósítás esetén.
A fő előny — védelem a Man-in-the-Middle támadások ellen, beleértve a CA feltörésének eseteit. A pinning haszontalanná teszi a támadó által kiadott hamis tanúsítványokat: még ha a CA alá is írt egy hamisítványt, az alkalmazás elutasítja azt. További előny — védelem a forgalom ellenőrzéséhez tanúsítványokat lecserélő vállalati proxy szerverek ellen. A Google Security Blog (2023) szerint a pinninggel rendelkező alkalmazásoknak 86%-kal kisebb az esélyük a forgalom elfogásával történő feltörésre, mint a csak szabványos TLS-ellenőrzést használó alkalmazásoknak.
A pinning fő hátránya — az önblokkolás kockázata: ha a szerver tanúsítványa megváltozik (meghosszabbítás, szolgáltatóváltás, kulcsrotáció) az alkalmazás frissítésének megjelenése előtt, a felhasználók elveszítik a hozzáférést a szerverhez. További hátrányok: a hibakeresés nehézsége (minden beállításváltozásnál frissíteni kell a pineket), az APK méretének 5–15 KB-os növekedése a TrustKit használatakor, és a változtatások gyors visszavonásának lehetetlensége új verzió nélkül. A kockázatok minimalizálására tartalék pineket, 2–3 havonta automatikus rotációt, valamint türelmi időszakot (grace period) használnak, amelyben az alkalmazás elfogadja mind a régi, mind az új tanúsítványt. Azt is figyelembe kell venni, hogy bekapcsolt pinning mellett a fejlesztés során nem használhatók proxy eszközök (Burp Suite, Charles) a hálózati kérések hibakereséséhez — a fejlesztői build-eknél a pinninget ki kell kapcsolni a BuildConfig.DEBUG jelzővel, a QA tesztelést pedig a kiadási aláíráson kell elvégezni bekapcsolt védelemmel. Egyes csapatok külön pinning tanúsítvánnyal rendelkező staging domaint használnak a fejlesztői környezet számára, hogy megőrizzék a védelmet még a fejlesztési fázisban is.
Nézzünk egy példát a Certificate Pinning Androidon történő megvalósítására az OkHttp — a hálózati kérésekhez használt szabványos könyvtár — segítségével. Az OkHttp beépített CertificatePinnert biztosít, amely elfogadja a nyilvános kulcsok SHA-256 hash-eit.
val certificatePinner = CertificatePinner.Builder()
.add(
"api.example.com",
"sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
)
.add(
"api.example.com",
"sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB="
)
.build()
val client = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build()
A fenti kódban két pint adunk hozzá az api.example.com domainhez: elsődleges (aktuális tanúsítvány) és tartalék (rotáció esetére). Az OkHttp automatikusan ellenőrzi, hogy a szerver tanúsítványa megfelel-e a megadott SHA-256 ujjlenyomatok egyikének. A tanúsítvány SHA-256 ujjlenyomatának lekéréséhez a parancs használatos: openssl s_client -connect api.example.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64. Fontos, hogy az ujjlenyomatokat ne nyílt formában tároljuk a kódban, hanem titkosítva vagy elhomályosítva: a MobSF statikus elemzése könnyen megtalálja a puszta SHA-256 karakterláncokat a DEX fájlokban. Ajánlott a pineket a res/raw erőforrásokban tárolni, AES-en keresztül titkosítva, és az alkalmazás indításakor natív kóddal (NDK/JNI) visszafejteni.
iOSen a Certificate Pinning fő eszköze a nyílt forráskódú TrustKit könyvtár. Az OkHttp-val ellentétben a TrustKit deklaratív módon konfigurálható az Info.plisten keresztül, ami lehetővé teszi a pinek megváltoztatását az alkalmazás újrafordítása nélkül. A konfiguráció egy doméneket tartalmazó szótárat és a nyilvános kulcsok SHA-256 ujjlenyomatainak tömbjét foglalja magában. A TrustKit automatikusan elfogja az NSURLSession kéréseket, és ellenőrzi a tanúsítványokat az adatátvitel megkezdése előtt. A TrustKit egyik kulcsfontosságú jellemzője — a pin-érvényesítési jelentések támogatása: a könyvtár jelentéseket küldhet egy megadott végpontra pin eltérés esetén, ami gyors reagálást tesz lehetővé a tanúsítvány-anomáliákra. Az Apple natív NSPinnedDomains mechanizmust is biztosít az Info.plist-ben iOS 14-től kezdve, de a TrustKit továbbra is előnyösebb választás a rugalmasabb konfiguráció, a jelentéstámogatás és a pinek rendszerfrissítés nélküli cseréjének lehetősége miatt. A TrustKit a didReceiveChallenge delegate-en keresztül integrálódik az URLSession-nel, sikeres pin-ellenőrzéskor .performDefaultHandling, eltérés esetén .cancelAuthenticationChallenge értéket ad vissza. A pin-érvényesítési jelentések figyeléséhez ajánlott egy külön végpontot konfigurálni, amely elemzi a hibák gyakoriságát: ha a jelentések száma hirtelen megnő — ez MitM támadást vagy a tanúsítvány küszöbönálló lejáratát jelezheti, ami azonnali pin-frissítést igényel.
Gyakran Ismételt Kérdések
Certificate Pinning — olyan, mintha elmentenéd egy barátod ujjlenyomatát a telefonodban: megjegyzed, hogyan néz ki a szerver “helyes” tanúsítványa, és nem bízol meg senki másban, még akkor sem, ha valaki egy “hivatalos” központtól származó igazolványt mutat.
A szokásos HTTPS megbízik bármely tanúsítványban, amelyet bármely CA aláírt a több száz központból. A Certificate Pinning egy “felülről jövő” ellenőrzést ad hozzá: a tanúsítványnak nem csak érvényesnek kell lennie, hanem konkrétan annak, amelyet az alkalmazás kódjában rögzítettél.
Ajánlott 2–3 pin tárolása: az aktuális és egy tartalék az új tanúsítványhoz. 1–2 hónappal a tanúsítvány változása előtt adj ki egy új alkalmazásverziót a jövőbeli tanúsítvány pinjének hozzáadásával. A változás után a régi pin eltávolításra kerül a következő kiadásból.
Igen, használható. A pinning bármilyen tanúsítvánnyal működik, beleértve a Let's Encrypt-et is. Fontos megjegyezni, hogy az ingyenes tanúsítványok rövid érvényességi idővel rendelkeznek (3 hónap), ezért a tartalék pinek stratégiája és az automatikus rotáció kötelezővé válik.
A pinning teszteléséhez használj Burp Suite-t vagy mitmproxy-t. Ha a pinninggel ellátott alkalmazás megfelelően van konfigurálva, a proxy eszköz nem tudja elfogni a forgalmat — a kapcsolat megszakad a kézfogás szakaszában. Az integrációs tesztekhez használd az OkHttp MockWebServer-ét.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is