App security: certificate pinning
Il certificate pinning e una tecnica di sicurezza che obbliga l'app a verificare un certificato specifico (o la sua chiave pubblica) per connettersi al server. Previene attacchi man-in-the-middle anche in caso di compromissione delle Certificate Authority. E uno dei pochi mezzi efficaci per difendersi da MITM avanzati.
Pinning del certificato vs della chiave
Il certificate pinning verifica l'intero certificato; va aggiornato a ogni rotazione (anche annuale). Il public key pinning verifica solo la chiave pubblica, sopravvive al rinnovo del certificato finché resta la stessa chiave: più flessibile, e l'approccio raccomandato.
Implementazione iOS
Usa URLSession con un'URLSessionDelegate che valida il certificato server in didReceive challenge. Calcola SHA-256 della chiave pubblica e confrontalo con il valore atteso. Librerie come TrustKit semplificano l'integrazione e gestiscono il report di violazione.
Implementazione Android
Network Security Config (XML) supporta nativamente il pinning con tag pin-set. In alternativa OkHttp ha CertificatePinner: aggiungi i SHA-256 attesi e l'errore viene sollevato in automatico per ogni connessione non conforme.
Public key pinning approach
Il pinning della chiave pubblica e preferibile perché sopravvive al rinnovo del certificato finché resta la stessa CSR. Calcola SHA-256 della SPKI con openssl dgst. Inserisci 2-3 pin (corrente + backup futuri) per consentire rotazione senza downtime.
Network Security Config Android
File XML res/xml/network_security_config.xml. Permette pinning, configurazione CA personalizzate, override per debug. Riferimento nel manifest con android:networkSecurityConfig. Funziona da Android 7+: per versioni precedenti, usa OkHttp CertificatePinner.
TrustKit iOS
Libreria open source che semplifica enormemente l'implementazione. Configurazione via plist (pin per dominio, max age, report URI). Gestisce report di violazione (HPKP-style) inviati a server di backend. Riduce a una manciata di righe l'integrazione completa.
Kill switch e operativita
Il rischio principale del pinning e di bloccare gli utenti se la rotazione del certificato e gestita male. Implementa un kill switch lato server (es. via Remote Config) per disattivare il pinning in emergenza. Documenta la rotazione nel runbook DevOps con scadenze, owner, processo di aggiornamento dei pin nell'app.
Modelli pubblici di pinning
HPKP (HTTP Public Key Pinning) era il modello web, ora deprecato. Mobile usa modelli proprietari (TrustKit, OkHttp CertificatePinner). Apple App Transport Security non offre pinning nativo: usa NSURLSessionDelegate. Android Network Security Config offre pinning dichiarativo da Android 7+. Per cross-platform, considera librerie unificate o wrap delle API native.
Pinning per microservizi
Se il backend usa molti microservizi con domini diversi, pin solo i critici (auth, payment, user data). Pinning su CDN, analytics, error reporting non e generalmente necessario e introduce fragilita. Documenta la decisione per ogni endpoint. Considera che alcuni CDN ruotano certificati frequentemente, rendendo il pinning impraticabile.
Procedura passo-passo
- Estrai SHA-256 della chiave pubblica del tuo server (openssl, ssllabs).
- Pianifica almeno un backup pin per gestire la rotazione.
- iOS: implementa URLSessionDelegate o adotta TrustKit.
- Android: aggiungi network_security_config.xml e referenzialo nel manifest.
- Implementa logging delle violazioni in produzione.
- Imposta una modalita di rollback (kill switch) per disabilitare il pinning lato server.
- Documenta i pin attivi e le scadenze nel runbook DevOps.
Monitoring e alerting
Configura il client per inviare report di violazione pinning a un'endpoint backend. Pattern HPKP-like: tag report con device info, app version, certificate hash incontrato. Monitora gli alert: spike improvvisi indicano MITM in corso o rotation non comunicata del certificato. Logga ma non blocchi inizialmente, poi gradualmente attivi enforcement.
Errori comuni e come risolverli
- Pin singolo senza backup: rischi di bloccare gli utenti alla rotazione.
- Pin del certificato anziche della chiave: rotazione frequente, errori facili.
- Mancato kill switch: se sbagli pin, l'app non si connette più.
- Test solo su simulatore: alcuni MITM funzionano solo su dispositivo reale.
- Pinning su API di terze parti: spesso non gestibile, valuta l'esposizione al rischio.
Domande frequenti
D: Il pinning sostituisce HTTPS?
R: No, e una protezione aggiuntiva sopra HTTPS.
D: Funziona con load balancer e CDN?
R: Si, ma pinna la chiave del certificato esposto dal CDN, non del backend.
D: Devo pinnare tutti i server?
R: Solo gli endpoint critici (autenticazione, pagamenti). Le risorse statiche di solito non lo richiedono.
D: Devo pinnare se uso Cloudflare?
R: Pin la chiave di Cloudflare se l'endpoint critico passa da loro. Cloudflare ruota raramente le chiavi, ma confermalo con il loro support.
Rotazione e operations
Documenta processo di rotazione certificati: chi e responsabile, quando ruotare, come distribuire nuovi pin. Include in runbook DevOps. Test rotazione in staging prima di produzione. Pin backup permettono rotazione zero-downtime. Lessons learned: rotazione mal gestita causa outage maggiore della minaccia che pinning previene.
Combinare pinning con altre tecniche di defense in depth e essenziale: HSTS lato server, TLS 1.3 minimum, valid certificate chains, OCSP stapling. Pinning da solo non basta; e parte di strategia di sicurezza più ampia. Per app finanziarie e regolate, audit di sicurezza periodici sono raccomandati per validare l'efficacia delle protezioni.
Hai bisogno di aiuto?
Se vuoi sviluppare la tua app con G Tech Group, scrivici tramite il modulo di contatto.