Decifrare il traffico SSL/TLS con Wireshark

Introduzione

SSL e TLS sono protocolli di crittografia che proteggono le comunicazioni tra client e server su Internet. Di norma i dati scambiati sono cifrati, quindi in chiaro Wireshark li vede come sequenze apparentemente casuali. Per poter leggere il contenuto (ad esempio il testo HTML o altri dati sensibili) bisogna disporre delle chiavi di sessione usate nella crittografia. Fortunatamente è possibile farlo tramite un file di log delle chiavi pre-master (SSLKEYLOGFILE) generato dal browser. In questa guida vedremo come ottenere queste chiavi su Windows, Linux e MacOS e come configurare Wireshark (versione 4.x) per decifrare il traffico SSL/TLS.

Come funziona SSL/TLS

Durante il TLS handshake il client e il server concordano chiavi cifranti, rendendo sicura la connessione. In sintesi: il browser invia un "Client Hello", il server risponde con un certificato e le impostazioni di cifratura (versione TLS e suite crittografiche), il client verifica il certificato, scambia chiavi (per esempio tramite Diffie-Hellman o RSA) e insieme al server genera una chiave di sessione simmetrica. Da quel momento tutto il traffico è cifrato con quella chiave . Wireshark, di default, non può decifrare questo traffico perché non conosce la chiave di sessione.
Per decriptare il traffico SSL/TLS è quindi necessario fornire a Wireshark le chiavi di sessione. Il metodo raccomandato è usare il file di log delle pre-master secret generato dal client (browser): basta impostare la variabile d'ambiente SSLKEYLOGFILE in modo che il browser scriva in un file tutte le chiavi di sessione. Wireshark può leggere questo file e usare le chiavi per decrittare il traffico. Questa procedura funziona anche con protocolli recenti (TLS 1.2/1.3) e cifrature a Perfect Forward Secrecy come ECDHE. L'alternativa – usare la chiave RSA privata del server – è ormai obsoleta e funziona solo in casi rari.

Preparare il file di log delle chiavi (SSLKEYLOGFILE)

Per ottenere le chiavi di sessione, bisogna innanzitutto creare un file di log e dire al browser di scriverlo. Il procedimento varia a seconda del sistema operativo.

  • Windows: si definisce la variabile d'ambiente SSLKEYLOGFILE puntando a un percorso di file (ad es. C:\ssl-keys.log).
  • Linux: si esporta SSLKEYLOGFILE nel profilo utente (ad es. in ~/.bashrc o direttamente nel terminale) con un percorso a un file nel proprio home (export SSLKEYLOGFILE=~/ssl-keys.log).
  • MacOS: si esporta SSLKEYLOGFILE nel profilo shell (ad es. in ~/.zshrc o avviando il browser dal terminale) similmente a Linux, puntando a un file di log.

Dopo aver impostato la variabile, riavviare completamente il browser (Chrome, Firefox, etc.). A questo punto, il browser memorizzerà in tempo reale nel file indicato le chiavi usate nelle sessioni TLS. È utile verificare che il file venga creato e popolato visitando un sito HTTPS qualsiasi e controllando che non sia vuoto (ad esempio con cat in Linux/Mac o aprendo con Blocco note in Windows).

Figura: Esempio di finestra "Proprietà di sistema" in Windows dove aprire le Variabili d'ambiente (avanzate) per impostare SSLKEYLOGFILE.

Windows

  1. Apri le Impostazioni di sistema avanzate (ad es. con "Questo PC" tasto destro --> Proprietà --> Impostazioni di sistema avanzate).
  2. Clicca Variabili d'ambiente….
  3. Sotto "Variabili utente", premi Nuova…. Nome variabile: SSLKEYLOGFILE. Valore variabile: il percorso completo (es. C:\Users\\sslkey.log) dove vuoi salvare il log. Premi OK.
  4. Chiudi e riapri il browser (Chrome/Firefox) affinché legga la nuova variabile.
Attenzione: su Windows usa percorsi validi. Ad esempio puoi mettere C:\ssl-keys.log o %USERPROFILE%\ssl-keys.log. Il file verrà creato automaticamente quando visiterai un sito HTTPS.

Linux

  1. Chiudi completamente il browser.
  2. In un terminale, esporta la variabile SSLKEYLOGFILE (ad esempio):
  3. Bash output
    
    # Questo comando imposta temporaneamente la variabile nella sessione corrente.
    export SSLKEYLOGFILE=~/ssl-keys.log
    
  4. Da quello stesso terminale, avvia il browser (il browser erediterà la variabile). Ad esempio:
    • Chrome: google-chrome &
    • Firefox: firefox &
    • Visita un sito HTTPS e verifica che ~/ssl-keys.log sia stato creato e contenga delle chiavi (ad es. file ~/ssl-keys.log deve mostrare testo).
    Per rendere permanente questa impostazione, si può mettere l'export in ~/.bashrc o in ~/.zshrc secondo la shell usata, poi riaprire il terminale e il browser.

    MacOS

    Su Mac la procedura è simile a Linux, ma occorre far partire il browser dalla shell dove è impostata la variabile (specialmente su macOS Catalina e versioni successive con zsh). Ecco i passi:

    1. Chiudi Chrome o Firefox.
    2. Apri Terminale e digita:
      Bash output
      
      export SSLKEYLOGFILE="$HOME/ssl-keys.log"
      
    3. (oppure puoi aggiungerlo nel tuo ~/.zshrc o ~/.bash_profile).
    4. Sempre da Terminale, avvia il browser usando il comando open, ad es.:
      • Chrome: open /Applications/Google\ Chrome.app
      • Firefox: open /Applications/Firefox.app
      • In questo modo il programma eredita la variabile d'ambiente.
    5. Visita un sito HTTPS e controlla che il file ~/ssl-keys.log sia stato creato (ad es. con cat ~/ssl-keys.log). Dovrebbe contenere righe con lunghe stringhe esadecimali (le pre-master secrets).

    Verifica del file di chiavi

    Una volta impostato, visita uno o più siti HTTPS. Quindi controlla il file:

    • In Windows, aprilo con un editor di testo (o type %USERPROFILE%\ssl-keys.log nel prompt) e assicurati che ci siano righe generate.
    • In Linux/Mac, esegui cat ~/ssl-keys.log nel terminale: vedrai linee che iniziano con "CLIENT\_RANDOM" seguite da dati codificati.
    Se il file è pieno di dati così, significa che il browser sta registrando correttamente le chiavi.

    Configurare Wireshark per la decrittazione

    Ora siamo pronti a usare Wireshark per decrittare. Avvia Wireshark 4.x (o successiva) e:

    1. Vai su Edit > Preferences (o Wireshark > Preferences su macOS).
    2. Nella colonna di sinistra espandi Protocols e scorri fino a TLS (in alcune versioni potrebbe ancora apparire come "SSL" ma è TLS).
    3. Trova la voce (Pre)-Master-Secret log filename e imposta il percorso del file ssl-keys.log creato (clicca Browse e selezionalo).
    4. Conferma con OK.

    Nota importante: per funzionare correttamente la decrittazione, assicurati che nelle preferenze di Wireshark (sezione Protocols > TCP) sia abilitata l'opzione "Reassemble TCP segments" e, se presente, "Reassemble out-of-order segments". Queste impostazioni permettono a Wireshark di ricostruire correttamente i flussi TCP prima di decifrarli.

    Catturare e decifrare il traffico

    Avvia una cattura in Wireshark sull'interfaccia di rete usata dal browser (es. Wi-Fi o Ethernet). In Windows potrebbe essere necessario installare WinPcap/Npcap e scegliere l'interfaccia giusta (a volte anche "Loopback" per traffico locale). Su Mac/Linux semplicemente seleziona l'interfaccia attiva.

    Riduci a icona Wireshark e apri il browser configurato con SSLKEYLOGFILE. Visita una pagina HTTPS (es. https://example.com) per generare traffico cifrato.

    Torna su Wireshark, ferma la cattura o lascia continuare. Usa un filtro per isolare TLS/SSL, ad esempio digita tls nel campo filtro e applicalo. Vedrai i pacchetti TLS Application Data.

    Clicca su un pacchetto TLS che contiene dati (non solo handshake). Nella finestra inferiore di Wireshark, apparirà una sezione "Decrypted TLS data" o "Application Data" dove potrai leggere il contenuto decriptato. Spesso i dati sono ulteriormente compressi o in formato HTTP: puoi switchare nelle sottoschede "Decrypted TLS" o "Data" per vedere il payload puro. Se ad esempio visiti un sito web, vedrai il codice HTML o JSON in chiaro.

    Nota: se il contenuto è compresso (per es. GZIP), potresti dover cliccare "Uncompressed entity body" o abilitare la decompressione automatica per leggerlo in testo semplice.

    Uso della chiave RSA privata (metodo alternativo)

    Wireshark consente anche di importare una chiave privata RSA per decrittare traffico SSL/TLS con scambio chiavi RSA (non usato quando c'è Perfect Forward Secrecy). Questo metodo è ormai sconsigliato perché la maggior parte delle connessioni moderne usa ECDHE/DHE, che non riciclano la chiave RSA in ogni sessione. In ogni caso, se disponi del file .pem della chiave privata del server e stai analizzando il traffico di quel server, potresti importarlo su Edit > Preferences > Protocols > TLS > RSA Keys List (oppure RSA Keys nelle versioni più recenti). Dovrai specificare indirizzo IP del server, porta, protocollo (tipicamente HTTPS), percorso della chiave e la passphrase se necessaria. Questo sblocca la decrittazione per connessioni TLS 1.0-1.2 senza PFS. Wireshark ti segnalerà se la chiave è utilizzabile.

    Tuttavia, ripetiamo: il metodo pre-master secret log via SSLKEYLOGFILE funziona con qualsiasi suite (anche TLS 1.3/ECDHE) e non richiede accesso alla chiave privata del server.

    Domande frequenti (FAQ)

    • È possibile decifrare il traffico HTTPS senza il file di chiavi?
      No. Per decriptare passivamente il traffico SSL/TLS serve o il file di chiavi di sessione (SSLKEYLOGFILE) o la chiave privata del server. Senza di essi le sessioni rimangono indecifrabili.
    • Funziona con TLS 1.3?
      Sì, impostando SSLKEYLOGFILE funziona anche per TLS 1.3. I browser moderni registrano le per-session secrets nonostante il 1.3 utilizzi ECDHE. Basta che SSLKEYLOGFILE sia impostato e il browser avviato tramite esso. Wireshark 4.x decripterà correttamente il payload.
    • Cosa succede se non vedo nulla di decifrato?
      Verifica che:
      1. il file SSLKEYLOGFILE sia creato e popolato
      2. in Wireshark hai impostato correttamente il percorso in Preferences --> Protocols --> TLS
      3. nelle preferenze TCP sia abilitata l'opzione di riassemblare i segmenti TCP. Inoltre, assicurati di guardare i pacchetti dopo il completo handshake TLS (dopo il ClientKeyExchange).
    • Come faccio a vedere l'HTML di una pagina?
      Dopo la decrittazione, individua i pacchetti TLS Application Data contenenti dati HTTP. Se il sito usa compressione (GZIP), Wireshark mostrerà il contenuto compresso nel tab principale. Per ottenere il testo leggibile, passa al tab "Decompressed entity body" o
      "Uncompressed entity body"
      ; Wireshark decomprimerà il flusso automaticamente.
    • Quali browser supportano SSLKEYLOGFILE?
      In genere Chrome, Firefox e altri browser basati su NSS/boringssl o OpenSSL rispettano SSLKEYLOGFILE. Safari (WebKit) non supporta questo metodo di default. In caso, potresti usare Firefox/Chrome per le catture.
    • Perché Wireshark mostra ancora "SSL" nelle preferenze?
      In Wireshark 4.x il protocollo è elencato come TLS, ma in alcune guide o versioni precedenti lo si chiamava ancora "SSL". L'impostazione del file di log è ora sotto
      Protocols > TLS
      , non più SSL.
    • Serve privilegio di root o installare plugin?
      No. Su Linux/Mac basta che il terminale (o il login) abbia esportato SSLKEYLOGFILE. Wireshark non richiede permessi speciali per leggere il file di log. Su Windows, la variabile può essere definita a livello utente (non serve admin, anche se in System variables diventa globale). Assicurati solo di lanciare il browser dopo aver impostato la variabile.
    • Posso inserire le chiavi direttamente in un file PCAPNG?
      Wireshark 3.x+ supporta l'inserimento (embedding) delle per-session secrets dentro al file pcapng, usando lo script inject-tls-secrets.py. In tal modo non serve tenere un file esterno. Ma per semplicità, il metodo illustrato qui (file esterno) è già efficace.

    Con questi passaggi, potrai leggere in chiaro il contenuto del traffico HTTPS su tutte le piattaforme principali usando Wireshark. L'uso del file di log delle chiavi è attualmente il modo più semplice e affidabile per decrittare SSL/TLS durante l'analisi di rete.