Certificate Pinning: ce este, metode de fixare a certificatelor și cum se implementează

Autor: IT Sectr Publicat: 2026-04-02 Timp de citire: 8 min

Certificate Pinning (fixarea certificatului) — este o tehnică de securitate prin care aplicația mobilă verifică dacă certificatul serverului corespunde unui eșantion cunoscut anterior, nu doar are încredere în orice certificat din lanțul CA. Spre deosebire de verificarea TLS obișnuită, bazată pe sute de centre de certificare, pinning restrânge încrederea la un singur certificat specific sau la cheia sa publică. Conform OWASP Mobile Security Testing Guide (2024), implementarea Certificate Pinning blochează 100% din scenariile de atac Man-in-the-Middle legate de înlocuirea certificatului. OWASP MSTG, 2024

Principalele puncte

  • Certificate Pinning — tehnica de fixare strictă a aplicației la un certificat specific sau la cheia publică a serverului.
  • Pinning prin cheie publică — cea mai flexibilă și sigură metodă, care nu necesită actualizarea aplicației la schimbarea certificatului.
  • Diferența față de TLS — la TLS obișnuit, clientul are încredere în orice CA; pinning adaugă un al doilea nivel de verificare pentru un certificat specific.
  • Riscul de blocare — la actualizarea incorectă a certificatului, aplicația poate pierde conexiunea cu serverul până la lansarea noii versiuni.
  • OkHttp și TrustKit — cele mai populare biblioteci pentru implementarea pinning pe Android și respectiv iOS.

Ce este Certificate Pinning?

Certificate Pinning — este un mecanism de securitate prin care aplicația salvează (sau „coasă” — pin) un eșantion al certificatului serverului și la fiecare conexiune compară certificatul primit cu acest eșantion. Dacă certificatul nu corespunde — conexiunea este întreruptă, chiar dacă este semnat oficial de un centru de certificare de încredere. Acest lucru protejează împotriva atacurilor în care atacatorul obține un certificat fals printr-un CA compromis (cum s-a întâmplat cu DigiNotar în 2011 sau Comodo în 2011).

Cum funcționează fixarea certificatului

Procesul de pinning constă din trei etape: extragerea amprentei (fingerprint) a certificatului sau a cheii publice dintr-o instanță de încredere; stocarea acestei amprente în codul sau resursele aplicației; compararea în faza TLS-handshake. Dezvoltatorul poate fixa amprenta SHA-256 a întregului certificat sau doar a cheii publice (Public Key Pinning). A doua abordare este preferată: la prelungirea certificatului, cheia publică rămâne adesea aceeași, iar aplicația nu pierde conexiunea cu serverul. Conform recomandării OWASP, numărul minim de pinuri — 2: unul curent și unul de rezervă în caz de rotație a cheilor. Bibliotecile moderne, precum OkHttp și TrustKit, automatizează procesul de verificare a pinurilor specificate la fiecare conexiune TLS fără costuri suplimentare pentru dezvoltator. Este important de înțeles că pinning nu înlocuiește verificarea standard TLS, ci o completează: mai întâi se execută handshake-ul obișnuit cu validarea lanțului de certificate, apoi — verificarea suplimentară pinning. O astfel de protecție pe două niveluri elimină vulnerabilitățile legate de compromiterea CA, inclusiv cazurile de emitere eronată a certificatelor și atacurile asupra infrastructurii centrelor de certificare.

Tipuri de Certificate Pinning

Există mai multe abordări pentru implementarea Certificate Pinning, fiecare cu propriile caracteristici de stocare și verificare. Alegerea metodei depinde de arhitectura aplicației, frecvența actualizării certificatelor și cerințele de flexibilitate.

Tip pinningCe se salveazăFlexibilitateExemplu de utilizare
Certificate PinningÎntregul certificat X.509ScăzutăCertificat fix pe 1–2 ani
Public Key PinningCheia publică (SPKI)MedieAbordarea recomandată de OWASP
Hash PinningAmprenta SHA-256MediePopular în OkHttp (certificatePinner)
CA PinningCA intermediarRidicatăAplicații corporative

Metoda cea mai echilibrată este Public Key Pinning, recomandată de OWASP și Google. În locul certificatului specific (care se schimbă la fiecare 1–2 ani), aplicația stochează amprenta SubjectPublicKeyInfo — o abstractizare a cheii publice. Dacă certificatul se prelungește cu aceeași cheie (key reuse), pinul rămâne valabil. Dacă cheia se schimbă — dezvoltatorul adaugă din timp un pin de rezervă în actualizarea aplicației. În proiectele mobile se folosește strategia min/max pins: minimum 2 pinuri, inclusiv cel de rezervă, și maximum 4 pentru a preveni umflarea și creșterea timpului de verificare.

Strategia de alegere a tipului de pinning

Alegerea tipului specific de pinning depinde de arhitectura și cerințele aplicației. Pentru aplicațiile mobile publice care comunică cu REST API printr-un singur domeniu, Public Key Pinning cu două pinuri prin OkHttp sau TrustKit este optim. Pentru aplicațiile corporative cu propriul centru de certificare, CA Pinning este potrivit — nu necesită actualizare la schimbarea certificatelor client, deoarece încrederea este legată de CA, nu de certificatul final. Pentru sistemele IoT și embedded, se recomandă Certificate Pinning cu fixarea întregului certificat: dispozitivele se actualizează rar, de aceea controlul asupra întregului lanț de încredere este critic. Monitorizarea datelor de expirare a pinurilor — o practică obligatorie: configurați alerte cu 30, 14 și 7 zile înainte de expirarea certificatului pentru a apuca să lansați o actualizare a aplicației cu pinuri noi înainte ca certificatul curent să devină invalid. Pentru automatizarea lansării actualizărilor cu pinuri noi, se recomandă utilizarea Firebase Remote Config sau a unei API de configurare proprii, care permite actualizarea dinamică a listei de pinuri fără publicarea unei noi versiuni în magazinul de aplicații.

Avantaje și dezavantaje ale Certificate Pinning

Certificate Pinning crește semnificativ securitatea aplicației mobile, dar impune o sarcină operațională asupra echipei de dezvoltare. Este important să căntăriți beneficiile protecției și riscul de blocare a conexiunii la o implementare incorectă.

Principalul avantaj — protecția împotriva atacurilor Man-in-the-Middle, inclusiv cazurile de compromitere a CA. Pinning face inutile certificatele false emise de atacator: chiar dacă CA a semnat un fals, aplicația îl va respinge. Un plus suplimentar — protecția împotriva serverelor proxy corporative care înlocuiesc certificatele pentru inspecția traficului. Conform Google Security Blog (2023), aplicațiile cu pinning au șanse cu 86% mai mici de a fi sparte prin interceptarea traficului comparativ cu aplicațiile care folosesc doar verificarea standard TLS.

Principalul dezavantaj al pinning — riscul de autoblocare: dacă certificatul serverului se schimbă (prelungire, schimbarea furnizorului, rotația cheilor) înainte de lansarea actualizării aplicației, utilizatorii pierd accesul la server. Dezavantaje suplimentare: dificultatea depanării (la fiecare modificare a setărilor trebuie actualizate pinurile), creșterea dimensiunii APK cu 5–15 KB la utilizarea TrustKit și imposibilitatea de a reveni rapid la modificări fără o nouă versiune. Pentru minimizarea riscurilor, se folosesc pinuri de rezervă, rotație automată la fiecare 2–3 luni și o perioadă de grație (grace period) în care aplicația acceptă atât certificatul vechi, cât și pe cel nou. De asemenea, trebuie avut în vedere că, cu pinning-ul activat în timpul dezvoltării, nu se pot folosi instrumente proxy (Burp Suite, Charles) pentru depanarea cererilor de rețea — pentru versiunile de dezvoltare, pinning trebuie dezactivat prin flag-ul BuildConfig.DEBUG, iar testarea QA trebuie efectuată pe semnătura de lansare cu protecția activată. Unele echipe folosesc un domeniu staging cu un certificat pinning separat pentru mediul de dezvoltare, pentru a păstra protecția chiar și în faza de dezvoltare.

Implementarea Certificate Pinning în Android

Să examinăm un exemplu de implementare a Certificate Pinning pe Android folosind OkHttp — biblioteca standard pentru cereri de rețea. OkHttp oferă un CertificatePinner încorporat care acceptă hash-uri SHA-256 ale cheilor publice.

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

În codul de mai sus adăugăm două pinuri pentru domeniul api.example.com: principal (certificatul curent) și de rezervă (în caz de rotație). OkHttp verifică automat dacă certificatul serverului corespunde unuia dintre hash-urile SHA-256 specificate. Pentru a obține hash-ul SHA-256 al certificatului se folosește comanda: openssl s_client -connect api.example.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64. Este important să stocați hash-urile nu în formă deschisă în cod, ci criptate sau ofuscate: analiza statică MobSF găsește ușor șirurile SHA-256 goale în fișierele DEX. Se recomandă stocarea pinurilor în resursele res/raw, criptate prin AES, și decriptarea lor la pornirea aplicației prin cod nativ (NDK/JNI).

Implementarea pe iOS prin TrustKit

Pe iOS, instrumentul principal pentru Certificate Pinning este biblioteca open-source TrustKit. Spre deosebire de OkHttp, TrustKit se configurează declarativ prin Info.plist, ceea ce permite schimbarea pinurilor fără recompilarea aplicației. Configurația include un dicționar cu domenii și un array de hash-uri SHA-256 ale cheilor publice. TrustKit interceptează automat cererile NSURLSession și verifică certificatele înainte de începerea transferului de date. O caracteristică cheie a TrustKit — suportul pentru rapoarte de validare a pinurilor: biblioteca poate trimite rapoarte la un endpoint specificat la nepotrivirea pinului, permițând reacția rapidă la anomalii ale certificatelor. Apple oferă, de asemenea, mecanismul nativ NSPinnedDomains în Info.plist începând cu iOS 14, dar TrustKit rămâne alegerea preferată datorită configurației mai flexibile, suportului pentru rapoarte și posibilității de înlocuire la cald a pinurilor fără actualizarea sistemului. TrustKit se integrează cu URLSession prin delegatul didReceiveChallenge, returnând .performDefaultHandling la verificarea reușită a pinului și .cancelAuthenticationChallenge la nepotrivire. Pentru monitorizarea rapoartelor de validare a pinurilor, se recomandă configurarea unui endpoint separat care analizează frecvența erorilor: dacă numărul de rapoarte crește brusc — aceasta poate indica un atac MitM sau expirarea iminentă a certificatului, necesitând actualizarea imediată a pinurilor.

Întrebări frecvente

Ce este Certificate Pinning în cuvinte simple?

Certificate Pinning — este ca și cum ai salva amprenta unui prieten în telefon: îți amintești cum arată certificatul „corect” al serverului și nu mai ai încredere în nimeni altcineva, chiar dacă cineva prezintă o legitimație de la un centru „oficial”.

Cu ce se deosebește Certificate Pinning de HTTPS obișnuit?

HTTPS obișnuit are încredere în orice certificat semnat de orice CA din sute de centre. Certificate Pinning adaugă o verificare „de sus”: certificatul trebuie să fie nu doar valid, ci exact acela pe care l-ați fixat în codul aplicației.

Cum se actualizează certificatul când se folosește Pinning?

Se recomandă stocarea a 2–3 pinuri: cel curent și unul de rezervă pentru noul certificat. Cu 1–2 luni înainte de schimbarea certificatului, lansați o nouă versiune a aplicației cu pinul viitorului certificat adăugat. După schimbare, pinul vechi este eliminat din versiunea următoare.

Se poate folosi Certificate Pinning cu CA gratuite?

Da, se poate. Pinning funcționează cu orice certificate, inclusiv Let's Encrypt. Este important de reținut că certificatele gratuite au o perioadă scurtă de valabilitate (3 luni), prin urmare strategia pinurilor de rezervă și rotația automată devin obligatorii.

Cum se testează Certificate Pinning în aplicație?

Pentru testarea pinning, utilizați Burp Suite sau mitmproxy. Dacă aplicația cu pinning este configurată corect, instrumentul proxy nu va putea intercepta traficul — conexiunea va fi întreruptă în faza de handshake. Pentru teste de integrare, utilizați MockWebServer de la OkHttp.

Rezumat

  • Certificate Pinning — tehnică de fixare a certificatului care protejează împotriva atacurilor Man-in-the-Middle și a înlocuirii CA.
  • Public Key Pinning — metodă recomandată de OWASP bazată pe amprenta cheii publice, nu pe întregul certificat.
  • OkHttp CertificatePinner pe Android și TrustKit pe iOS — instrumente principale de implementare a pinning în proiectele mobile.
  • Strategia 2+ pinuri previne blocarea aplicației la schimbarea certificatului pe server.
  • SHA-256 pinning necesită comanda openssl pentru generarea amprentei cheii publice a serverului.
  • Perioada de grație (grace period) — utilizarea pinului de rezervă cu date de valabilitate suprapuse reduce riscul pierderii conexiunii la zero.
  • Recomandare: implementați pinning prin cheie publică pentru toate domeniile de producție cu un pin de rezervă și configurați monitorizarea întreruperii conexiunii.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și