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.
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.
SSLKEYLOGFILE
puntando a un percorso di file (ad es. C:\ssl-keys.log
).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
).SSLKEYLOGFILE
nel profilo shell (ad es. in ~/.zshrc
o avviando il browser dal terminale) similmente a Linux, puntando a un file di log.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.
SSLKEYLOGFILE
. Valore variabile: il percorso completo (es. C:\Users\\sslkey.log
) dove vuoi salvare il log. Premi OK.C:\ssl-keys.log
o %USERPROFILE%\ssl-keys.log
. Il file verrà creato automaticamente quando visiterai un sito HTTPS.
SSLKEYLOGFILE
(ad esempio):
# Questo comando imposta temporaneamente la variabile nella sessione corrente.
export SSLKEYLOGFILE=~/ssl-keys.log
google-chrome &
firefox &
~/ssl-keys.log
sia stato creato e contenga delle chiavi (ad es. file ~/ssl-keys.log
deve mostrare testo).export
in ~/.bashrc
o in ~/.zshrc
secondo la shell usata, poi riaprire il terminale e il browser.
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:
export SSLKEYLOGFILE="$HOME/ssl-keys.log"
~/.zshrc
o ~/.bash_profile
).
open
, ad es.:
open /Applications/Google\ Chrome.app
open /Applications/Firefox.app
~/ssl-keys.log
sia stato creato (ad es. con cat ~/ssl-keys.log
). Dovrebbe contenere righe con lunghe stringhe esadecimali (le pre-master secrets).Una volta impostato, visita uno o più siti HTTPS. Quindi controlla il file:
type %USERPROFILE%\ssl-keys.log
nel prompt) e assicurati che ci siano righe generate.cat ~/ssl-keys.log
nel terminale: vedrai linee che iniziano con "CLIENT\_RANDOM" seguite da dati codificati.Ora siamo pronti a usare Wireshark per decrittare. Avvia Wireshark 4.x (o successiva) e:
ssl-keys.log
creato (clicca Browse e selezionalo).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.
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.
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.
SSLKEYLOGFILE
sia impostato e il browser avviato tramite esso. Wireshark 4.x decripterà correttamente il payload.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.SSLKEYLOGFILE
. Safari (WebKit) non supporta questo metodo di default. In caso, potresti usare Firefox/Chrome per le catture.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.inject-tls-secrets.py
. In tal modo non serve tenere un file esterno. Ma per semplicità, il metodo illustrato qui (file esterno) è già efficace.