SSL (Secure Sockets Layer) e TLS (Transport Layer Security) sono protocolli crittografici che garantiscono la trasmissione sicura dei dati tra un client e un server sulla rete. Crittografano tutto il traffico, impedendo l'intercettazione e la modifica dei dati da parte di aggressori. Secondo il Google Transparency Report (2025), più del 95% di tutto il traffico mobile mondiale utilizza la crittografia TLS. Senza questo protocollo, qualsiasi informazione inviata tramite Wi-Fi aperto o rete mobile può essere letta da terze parti. Cloudflare, 2024
Punti Chiave
SSL (Secure Sockets Layer) è un protocollo sviluppato da Netscape nel 1995 per proteggere il traffico web. La prima versione, SSL 1.0, non è mai stata pubblicata; SSL 2.0 (1995) e SSL 3.0 (1996) sono stati utilizzati fino ai primi anni 2000, ma contenevano vulnerabilità critiche. A SSL è succeduto TLS (Transport Layer Security) — una versione migliorata standardizzata dall'IETF. TLS 1.0 (1999) era basato su SSL 3.0, mentre le versioni successive TLS 1.1 (2006), TLS 1.2 (2008) e TLS 1.3 (2018) si sono gradualmente allontanate dall'architettura originale, aggiungendo nuovi algoritmi di crittografia e correggendo vulnerabilità. Oggi SSL è considerato obsoleto e tutti i sistemi moderni utilizzano TLS, sebbene entrambi i protocolli siano spesso menzionati insieme come SSL/TLS per inerzia.
La storia di SSL/TLS è iniziata con la necessità di trasmissione sicura dei dati nel web primordiale. Nel 1994, Netscape sviluppò SSL 1.0 per il suo browser Navigator, ma il protocollo non fu mai pubblicato a causa di seri problemi di sicurezza. SSL 2.0 uscì nel 1995 e fu utilizzato nella pratica, ma conteneva numerose vulnerabilità: mancanza di protezione contro attacchi Man-in-the-Middle, algoritmi di crittografia deboli e suscettibilità ad attacchi di troncamento. SSL 3.0 (1996) risolse la maggior parte dei problemi, ma entro il 2014 fu scoperta la vulnerabilità POODLE, dopo la quale l'IETF dichiarò ufficialmente obsolete tutte le versioni di SSL. TLS 1.0–1.3 hanno progressivamente migliorato la robustezza crittografica, le prestazioni e la privacy, con TLS 1.3 che ha ridotto l'handshake da due round-trip a uno — cosa criticamente importante per le applicazioni mobili con connessioni instabili.
Handshake è il processo di stabilimento di una connessione sicura tra un client e un server. Consiste in diversi passaggi sequenziali durante i quali le parti concordano la versione del protocollo, selezionano gli algoritmi di crittografia, scambiano le chiavi e si autenticano reciprocamente. In TLS 1.3, l'handshake richiede un solo round-trip di rete (1-RTT), mentre in TLS 1.2 ne servivano due (2-RTT).
Il primo passo è l'invio da parte del client di un ClientHello — un messaggio contenente un elenco di versioni TLS supportate, suite di cifratura e un numero casuale. Il server risponde con un ServerHello contenente la versione e la cifratura scelte, il suo certificato X.509 e una firma digitale. Il client verifica il certificato attraverso la catena di autorità di certificazione (CA), genera una chiave di sessione e la invia crittografata con la chiave pubblica del server estratta dal certificato. Dopo la conferma dal server, inizia la trasmissione sicura dei dati. L'intero handshake richiede 1–3 millisecondi sui dispositivi moderni, rendendolo impercettibile per l'utente.
La base dell'autenticazione TLS è l'Infrastruttura a Chiave Pubblica (PKI) costruita su certificati in formato X.509. Ogni certificato contiene: un nome di dominio (Common Name o Subject Alternative Name), la chiave pubblica del server, il nome dell'emittente (Autorità di Certificazione), una data di scadenza e la firma digitale della CA. Il client verifica il certificato del server lungo la catena di fiducia: dal certificato del server fino alla CA radice, il cui certificato è integrato nel sistema operativo. Sui dispositivi Android, i certificati radice sono memorizzati nel keystore di sistema, aggiornato tramite Google Play Services; su iOS — tramite gli aggiornamenti iOS. Se un anello della catena si rompe (certificato scaduto, mancata corrispondenza del dominio, CA sconosciuta), il client interrompe la connessione. Per i certificati auto-firmati (usati in sviluppo), è richiesta la fiducia esplicita — su Android tramite Network Security Config, su iOS tramite NSExceptionDomains in Info.plist. Il processo di validazione della catena di certificati include anche la verifica dello stato di revoca tramite CRL (Certificate Revocation List) o OCSP (Online Certificate Status Protocol), sebbene sui dispositivi mobili le richieste OCSP vengano spesso saltate per accelerare la connessione — questo è un compromesso tra sicurezza e prestazioni che gli architetti dovrebbero considerare.
Sebbene i termini SSL e TLS siano spesso usati come sinonimi, ci sono differenze tecniche fondamentali tra loro che influenzano la sicurezza e le prestazioni delle applicazioni mobili.
| Caratteristica | SSL 3.0 | TLS 1.2 | TLS 1.3 |
|---|---|---|---|
| Anno di rilascio | 1996 | 2008 | 2018 |
| Stato | Obsoleto (RFC 7568) | Attivo (raccomandato) | Attuale (migliore) |
| Round-trip | 2 | 2 | 1 |
| Algoritmo di scambio chiavi | RSA | RSA, ECDHE | ECDHE (solo) |
| Crittografia autenticata | No | GCM, CCM | AEAD obbligatorio |
| Perfect Forward Secrecy | No | Opzionale | Obbligatorio |
La principale differenza tra TLS 1.3 e i suoi predecessori è l'uso obbligatorio di Perfect Forward Secrecy (PFS) tramite il protocollo ECDHE. Ciò significa che anche se un aggressore ottiene accesso alla chiave privata del server, non può decifrare il traffico intercettato in precedenza. Per le applicazioni mobili, dove la compromissione del server è una minaccia reale, TLS 1.3 con PFS è un requisito di sicurezza obbligatorio.
Le versioni precedenti di SSL e TLS hanno vulnerabilità ben documentate che le rendono inadatte all'uso in produzione. POODLE (CVE-2014-3566) attacca SSL 3.0 tramite un padding oracle, consentendo di decifrare i cookie di sessione in 256 richieste. BEAST (CVE-2011-3389) sfrutta una vulnerabilità in TLS 1.0 in modalità CBC tramite un IV prevedibile. Heartbleed (CVE-2014-0160) — non è una vulnerabilità del protocollo ma un bug nell'implementazione di OpenSSL che permette di leggere la memoria del server: secondo Netcraft, oltre 500.000 server erano vulnerabili nel 2014. A partire da Android 10 (API 29) e iOS 13, tutti questi protocolli sono disabilitati a livello di sistema. Tuttavia, gli sviluppatori dovrebbero verificare la configurazione del proprio server tramite SSL Labs Test (qualys.com) prima di lanciare un'applicazione per assicurarsi che non ci siano suite di cifratura obsolete e che TLS 1.3 sia supportato.
Nelle applicazioni mobili, TLS protegge i dati a tre livelli: crittografia del contenuto (nessuno tranne il server può leggere i dati), verifica dell'integrità (i dati non possono essere modificati in transito) e autenticazione del server (il client è sicuro di connettersi al server corretto). L'autenticazione è particolarmente critica: senza di essa, un aggressore può impersonare il server tramite spoofing DNS o un punto di accesso Wi-Fi falso.
Secondo uno studio di Google Play Protect (2024), il 76% delle applicazioni Android utilizza TLS correttamente con verifica dei certificati. Il restante 24% commette errori: disabilita la verifica dei certificati per i test (e dimentica di riattivarla in produzione), utilizza certificati auto-firmati senza validazione o permette protocolli obsoleti come SSL 3.0 e TLS 1.0. Apple App Transport Security (ATS) su iOS richiede almeno TLS 1.2 dal 2017, e a partire da iOS 15, utilizza TLS 1.3 per impostazione predefinita per tutte le richieste di rete. Per una protezione aggiuntiva, si raccomanda anche di implementare Certificate Pinning — il vincolo a un certificato server specifico.
Vediamo un esempio di configurazione di una connessione HTTPS sicura in Android utilizzando OkHttp — una delle librerie di rete più popolari. Una configurazione corretta include l'uso forzato di TLS 1.3 e la verifica dei certificati.
val client = OkHttpClient.Builder()
.connectionSpecs(
listOf(
ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.tlsVersions(TlsVersion.TLS_1_3, TlsVersion.TLS_1_2)
.cipherSuites(
CipherSuite.TLS_AES_128_GCM_SHA256,
CipherSuite.TLS_AES_256_GCM_SHA384,
CipherSuite.TLS_CHACHA20_POLY1305_SHA256
)
.build()
)
)
.hostnameVerifier { hostname, session ->
SSLSession.DefaultHostnameVerifier.verify(hostname, session)
}
.build()
In questo esempio, limitiamo l'insieme delle versioni TLS supportate solo a 1.3 e 1.2, escludendo le obsolete TLS 1.0/1.1. Le suite di cifratura sono selezionate tra algoritmi moderni con modalità AEAD e Perfect Forward Secrecy obbligatoria. HostnameVerifier verifica che il nome host corrisponda al certificato. Su iOS, una configurazione simile viene effettuata tramite la configurazione URLSession con il parametro tlsMinimumSupportedProtocolVersion impostato su .TLSv13. Inoltre, su iOS è possibile impostare tlsMaximumSupportedProtocolVersion per limitare la versione superiore — utile per la compatibilità con server legacy che non sono ancora passati a TLS 1.3. Tale configurazione garantisce il massimo livello di sicurezza per la trasmissione dei dati in un'applicazione mobile.
Domande frequenti
TLS è una versione più recente e sicura del protocollo. SSL è obsoleto e non dovrebbe essere utilizzato (RFC 7568). In pratica, entrambi i termini si riferiscono alla crittografia HTTPS, ma tecnicamente tutti i sistemi moderni funzionano con TLS 1.2 o 1.3.
Installa uno strumento proxy come Burp Suite o Charles Proxy e intercetta il traffico dell'app. Se la connessione utilizza HTTPS e il certificato è valido — l'app utilizza TLS. Se il traffico va su HTTP — non c'è crittografia.
Per le build di produzione sono consentiti solo TLS 1.2 e TLS 1.3. I protocolli SSL 3.0, TLS 1.0 e TLS 1.1 devono essere disabilitati sia sul server che nell'applicazione client. Dal 2020, le principali piattaforme (Android, iOS, browser) richiedono almeno TLS 1.2.
Sì, è raccomandato. TLS verifica il certificato attraverso una catena di autorità di certificazione, ma se una CA viene compromessa (come accaduto con DigiNotar nel 2011), un aggressore potrebbe emettere un certificato falso. Il Pinning aggiunge un ulteriore livello di verifica.
TLS 1.3 riduce il tempo di stabilimento della connessione da 2 round-trip a 1, offrendo un miglioramento del 30–50% al primo collegamento. Per le applicazioni mobili con connessioni instabili (metropolitana, treni), questo è criticamente importante per la velocità di caricamento dei dati.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche