Probabilmente avrete sentito parlare di HTTPS e di come il lucchetto verde nel vostro browser ci dia tranquillità . Tuttavia, nel mondo dello sviluppo di app, fidarsi ciecamente della validità del certificato non è sempre sufficiente. Esiste un rischio latente: anche con una connessione crittografata, qualcuno potrebbe ascoltare di nascosto ciò che accade tra il vostro dispositivo e il server.
Per ovviare a questa vulnerabilità di sicurezza, è emersa una tecnica chiamata Certificate Pinning . In sostanza, dice alla nostra applicazione: "Non fidarti di una qualsiasi autorità di certificazione; accetta la connessione solo se il server presenta esattamente questo certificato o questa chiave pubblica". È come mettere un guardiano molto severo alla porta della nostra comunicazione.
Cos'è esattamente l'SSL Pinning e perché ne abbiamo bisogno?
Per comprendere appieno questo concetto, dobbiamo innanzitutto ricordare che il protocollo HTTPS standard si basa su una catena di fiducia . Quando ci si connette a un server, questo invia il proprio certificato digitale. Il dispositivo mobile verifica che tale documento sia stato firmato da un'Autorità di Certificazione (CA) riconosciuta come affidabile dal sistema operativo. Se la firma è valida e il certificato non è scaduto, la connessione viene stabilita.
Il problema sorge quando un malintenzionato riesce a infiltrarsi nella connessione a metà percorso, il famigerato attacco Man-in-the-Middle (MITM) . Se l'hacker ottiene da un'Autorità di Certificazione (CA) un certificato fraudolento ma valido, o se riesce a installare un certificato radice dannoso sul dispositivo della vittima, il sistema operativo approverà la connessione. A quel punto, l'attaccante può intercettare e modificare dati sensibili, come coordinate bancarie o password, senza che l'utente si accorga di nulla di anomalo.
È qui che entra in gioco il pinning. Invece di fidarsi di una qualsiasi CA riconosciuta, l'app memorizza una copia del certificato del server o dell'hash della chiave pubblica. Durante l'handshake, l'app confronta il certificato ricevuto con quello memorizzato. Se non corrispondono bit per bit, la connessione viene immediatamente interrotta, impedendo lo spoofing del server.
Tipi di ancoraggio: certificati e chiavi pubbliche
Non tutti i pinning vengono eseguiti allo stesso modo. A seconda di cosa decidiamo di "bloccare", abbiamo due approcci principali. Il primo è il Certificate Pinning , in cui memorizziamo l'intero file del certificato (.pem o .der). È l'opzione più semplice da implementare ma la più complessa da gestire, poiché ogni volta che il certificato del server scade e viene rinnovato, dovremo aggiornare l'applicazione nello store, altrimenti gli utenti perderanno il servizio.
La seconda opzione è il Public Key Pinning . In questo caso, memorizziamo solo l'hash (solitamente SHA-256) della chiave pubblica del certificato. Il vantaggio principale è che la chiave pubblica può rimanere intatta anche se il certificato viene rinnovato, il che ci offre maggiore flessibilità nella gestione dei certificati e riduce la frequenza degli aggiornamenti forzati delle app. Inoltre, memorizzando solo l'hash, il codice risulta più pulito e più difficile da decifrare tramite reverse engineering.
Implementazione tecnica su diverse piattaforme
Se stiamo lavorando con AndroidIl modo più moderno è usare il file network_security_config.xmlIn questo file XML definiamo i domini e gli hash dei certificati (PIN) che vogliamo autorizzare, consentendoci di Attiva le impostazioni di sicurezza essenziali su Android in modo nativo. Quindi, colleghiamo semplicemente questo file nel AndroidManifest.xmlIn passato, operazioni più complesse venivano eseguite sovrascrivendo la classe. DefaultHttpClient e la gestione degli archivi di certificati Java tramite keytoolTuttavia, la configurazione basata su XML è molto più efficiente.
Nell'ecosistema di iOSLe cose cambiano un po'. Possiamo sfruttare App Transport Security (ATS) configurando il file Info.plist per definire i domini ancorati. Tuttavia, per un controllo completo, è comune implementare la convalida in fase di esecuzione utilizzando URLSessionDelegateNel metodo di sfida di autenticazione, estraiamo il certificato dal server e lo confrontiamo con il certificato memorizzato localmente nel pacchetto dell'applicazione.
Per chi usa Strutture a condensatore o ibrideCi sono plugin come @capgo/capacitor-ssl-pinning che unificano il processo. In questi casi, la configurazione viene solitamente effettuata nel file di configurazione dell'app, specificando l'elenco dei certificati e abilitando la convalida. È fondamentale testare queste implementazioni con strumenti come Carlo Proxysimulando un attacco man-in-the-middle per confermare che l'applicazione rifiuta effettivamente la connessione quando il certificato non è quello previsto.
Rischi, limitazioni e manutenzione
Il pinning non è tutto rose e fiori. Il pericolo maggiore è quello che viene chiamato blocco per scadenza . Se il certificato del server scade e non hai aggiornato l'app con il nuovo PIN, tutti i tuoi utenti visualizzeranno errori di connessione. Per evitare questo disastro, la best practice è implementare PIN di backup . Memorizziamo l'hash di una chiave pubblica secondaria che useremo solo in caso di emergenza o rotazione imprevista.
D'altro canto, il blocco delle impostazioni può rappresentare un problema per gli sviluppatori che necessitano di eseguire il debug delle proprie comunicazioni. Affinché gli strumenti di monitoraggio funzionino correttamente, a volte è necessario disabilitare il blocco delle impostazioni negli ambienti di sviluppo o creare versioni di debug specifiche, assicurandosi sempre che questa funzionalità sia abilitata nella versione di produzione destinata all'utente finale.
Per quanto riguarda il web, Chrome è stato un pioniere nell'implementazione di concetti simili. Utilizza HSTS (HTTP Strict Transport Security) per imporre l'uso di HTTPS e mantiene un elenco di siti "precaricati" per prevenire vulnerabilità al primo contatto. Sebbene lo standard HPKP esistesse anche per il web, è caduto in disuso perché considerato troppo rischioso e in grado di rendere inaccessibili i siti web in caso di errore di configurazione.
L'implementazione del certificate pinning è una decisione strategica che bilancia la massima sicurezza con la continuità operativa del servizio. Limitando la fiducia a entità specifiche, proteggiamo le comunicazioni da attacchi sofisticati, a condizione di mantenere un controllo rigoroso sul ciclo di vita delle nostre chiavi e dei nostri certificati per evitare di lasciare i clienti senza accesso.
